Why does scanf("%s", val); return null?

huangapple go评论60阅读模式
英文:

Why does scanf("%s", val); return null?

问题

我试图将一个字符读入名为val的char*,但当我使用scanf()时,它返回null。以下是我的代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char *val;
    if (argc == 2)
    {
        val = argv[1];
    }
    else
    {
        scanf("%s", val);
    }
    printf("Val = %s", val);
}

如果我尝试使用malloc(),它会在输入只有一个字符长时不断从标准输入中读取,而这正是我希望我的输入的长度。

英文:

I'm trying to read a single character into a char* called val and when I use scanf() it returns null. Here is my code:

#include &lt;stdio.h&gt;

int main(int argc, char *argv[])
{
    char *val;
    if (argc == 2)
    {
        val = argv[1];
    }
    else
    {
        scanf(&quot;%s&quot;, val);
    }
    printf(&quot;Val = %s&quot;, val);
}

If I try to use malloc(), it will continuously read from standard input if the input is one character long, which is how long I want my input to be.

答案1

得分: 1

scanf(&quot;%s&quot;, val); 返回 null 的原因是 scanf() 需要将输入读入到一个有效的位置。


scanf(&quot;%s&quot;, val); 中,代码将一个未初始化的指针 val 传递给 scanf(),这会导致_未定义行为_(UB)。

相反,应该传递一个指向已准备好接受输入的内存位置的指针。

  • 传递一个指向已准备好接受字符的位置的指针。

  • 使用一个_宽度_来避免溢出。

  • 检查返回值。

    char *val;
    char s[100+1]; 
    if (argc == 2) {
      val = argv[1];
    } else {
      if (scanf(&quot;%100s&quot;, s) != 1) {
        fprintf(stderr, &quot;无效的输入\n&quot;);
        return -1;
      }
      val = s;
    }

要读取_单个_字符,可以使用以下方式:

    char ch; 
    if (scanf(&quot;%c&quot;, &amp;ch) != 1) {
      fprintf(stderr, &quot;无效的输入\n&quot;);
      return -1;
    }
英文:

> Why does scanf("%s", val); return null?

scanf() needs to read input into a valid location.


With scanf(&quot;%s&quot;, val);, code passes to scanf() an uninitialized pointer val to scanf(). This leads to undefined behavior (UB).

Instead, pass a pointer to memory ready to accept the input.

  • Pass a pointer to a location ready to accept characters.

  • Use a width to avoid overrun.

  • check the return value.

    char *val;
    char s[100+1]; 
    if (argc == 2) {
      val = argv[1];
    } else {
      if (scanf(&quot;%100s&quot;, s) != 1) {
        fprintf(stderr, &quot;Invalid input\n&quot;);
        return -1;
      }
      val = s;
    }

To read a single character use:

char ch; 
if (scanf(&quot;%c&quot;, &amp;ch) != 1) {
  fprintf(stderr, &quot;Invalid input\n&quot;);
  return -1;
}

huangapple
  • 本文由 发表于 2023年2月24日 11:01:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/75552257.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定