scanf 只读取第一个字段

scanf only reads first field

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

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

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

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

这是未定义的行为。你还没有初始化你的指针。你的编译器应该告诉你这个。

k.c:8:17: warning: variable 'c' is uninitialized when used here [-Wuninitialized]
  scanf("%s%s", c, p);

你需要做的是初始化你的指针。使用 malloc 是一种方法。

char *c=malloc(SIZE);
char *p=malloc(SIZE);

您想不惜一切代价避免未定义的行为,因为这意味着行为可以是任何东西,包括按照您想要的方式工作。它可以使调试成为一场噩梦。

但是正如 Swordfish 在评论中提到的那样,在没有为字符串指定最大长度的情况下执行此操作无异于自杀,因为您将无法控制是否写入缓冲区,这也是未定义的行为。

char *c, *p;

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

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

char c[20], p[20];

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

scanf for "%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);
}

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

你也可以使用 %ms 而不是 %s,因为它自己分配内存,不需要程序员手动分配内存。

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

  printf("Enter a command with a parameter: ");
  scanf("%ms%ms", &c, &p); //no need of allocating memory manually
  ... 
}