c - scanf 只读取第一个字段

标签 c scanf stdio

我想用 scanf 读取两个字符串并将它们存储在两个变量中。如何只有第一个似乎被正确读取,第二个只返回 (null),但我不确定为什么。

int main(int argc, char **argv) {
  char *c, *p;

  printf("Enter a command with a parameter: ");
  scanf("%s%s", c, p);
  ...
}

有人有想法,出了什么问题?我没有发现任何错误,据我所知,它应该可以工作。

最佳答案

char *c, *p;

这些只是指针,后面没有任何内存。此外,它们未初始化,因此读取或分配它们的值或读取或分配给它们指向的内存将是未定义的行为,并将产生 nasal demons .

为了读取用户的输入,你需要一个地方来保存内存。

char c[20], p[20];

将为c分配20个字符p 为 20 个字符. cp不是指针,而是数组 char[20] .然而,在大多数情况下,数组处理程序“衰退”(读作:神奇地改变)为指针。

scanf对于 "%s" scanf 修饰符需要一个指向 char char* 的指针有足够的内存来保存输入的字符串。

我会这样做:

int main(int argc, char **argv) {
  char c[20], p[20];

  printf("Enter a command with a parameter: ");
  scanf("%19s%19s", c, p);
}

19%19s限制 scanf这样它就不会将输入读取到 c 中越界的内存区域和/或 p指针,这也会导致未定义的行为。

关于c - scanf 只读取第一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53377940/

相关文章:

c - 将文件中的多行读入结构体数组 c

c - FILE类型的对象有哪些属性

c - C 中的字符串流

c - 无论输入如何,每个元音出现三次

c - 按名称排序结构(双向链表)

c - 将单词嵌入数组。 boolean 问题。

c - 在 yacc/bison 之外使用 lex/flex

c - 格式化字符串漏洞

c - 使用 %3d(scanf() 中的最大字段宽度说明符)时出现意外输出

c - getch() 和 getchar() 有什么区别?