c - 当先前定义的字符串数组的第一个字符串为 null 时,scanf() 不读取输入字符串

标签 c c-strings

我为字符串定义了一个数组。如果我以第一个元素不是空字符串的方式定义它,它就可以正常工作。当它是一个空字符串时,另一个字符串的下一个 scanf() 停止读取输入字符串,程序停止执行。

现在我不明白定义字符串数组如何影响 scanf() 读取输入。

  char *str_arr[] = {"","abc","","","b","c","","",""}; // if first element is "abc" instead of "" then works fine

  int size = sizeof(str_arr)/sizeof(str_arr[0]);

  int i;

  printf("give string to be found %d\n",size);


  char *str;
  scanf("%s",str);
  printf("OK\n");

最佳答案

其实,你误会了我的兄弟。 str_arr的初始化不影响 scanf() 的工作,但是在您看来它可能喜欢那样,但实际上并非如此。正如其他答案中所述,这也称为未定义行为C 本身的未定义行为定义非常模糊

C FAQ 像这样定义“未定义的行为”:

Anything at all can happen; the Standard imposes no requirements. The program may fail to compile, or it may execute incorrectly (either crashing or silently generating incorrect results), or it may fortuitously do exactly what the programmer intended.

这基本上意味着任何事情都可能发生。当你这样做时:

char *str;
  scanf("%s",str);

它是一个 UB。有时你会得到你不应该得到的结果并且你认为它的工作。这就是调试器派上用场的地方。几乎每次都使用它们,特别是在开始时。关于您的程序的其他建议:

  • 代替scanf()使用 fgets()读取字符串。如果你想使用 scanf 那么使用它就像 scanf("%ws",name);其中 name 是字符数组,w是字段宽度。
  • 使用 -Wall 选项进行编译以获得所有警告,如果您使用它,您可能会得到 warning that you are using str uninitialized .

继续阅读 THIS ARTICLE ,它有足够的信息来消除你的疑虑。

关于c - 当先前定义的字符串数组的第一个字符串为 null 时,scanf() 不读取输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17411905/

相关文章:

c - C语言中数组、&array、&array[0]的区别是什么?

c++ - BuildCommDCB 实际上做了什么?

检查套接字文件描述符是否可用?

c - 如何在 C 中将一个函数的输出传递给另一个函数?

c - 不确定用字符串数组初始化一维字符数组

c++ - 混合 C 和 C++ 代码时, main() 是否需要在 C++ 部分?

c - 将 SNMP 请求从 Agentx Master 转发到 Agentx Subagent

c++ - strncpy 和 strcat 没有按照我认为的方式工作 C++

c - 是否可以在运行时为 C 中的字符串分配正确的空间量?

c - 如何在c编程中将出生日期格式作为字符串输入