scanf只读取第一个字段

ano*_*ose 0 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);
  ...
}
Run Code Online (Sandbox Code Playgroud)

有人知道了,出了什么问题?我没有发现任何错误,而且根据我的理解它应该有效.

Kam*_*Cuk 6

char *c, *p;
Run Code Online (Sandbox Code Playgroud)

这些只是指针,没有任何记忆.此外,它们是未初始化的,因此阅读或指定它们的价值或读取或分配给它们指向的记忆将是不确定的行为并将产生鼻子恶魔.

为了读取用户的输入,您需要一个保存内存的位置.

char c[20], p[20];
Run Code Online (Sandbox Code Playgroud)

将分配20个字符c和20个字符p.c并且p不是指针,而是数组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);
}
Run Code Online (Sandbox Code Playgroud)

19%19s限制scanf,使得它不读取输入到存储器区域,其列于界c和/或p指针,这将导致未定义的行为也是.