“scanf with printf”vs“fgets with printf”

时间:2014-01-22 15:35:28

标签: c printf scanf fgets

我知道使用 scanf fgets 的差异和优势/劣势。

我不理解printf和这两个C标准函数之间的关系。

我有这个简单的代码:

 void print_choice(char * list, char * choice)
{
  /* check parameters */
  if(!list || !choice)
    return;

  printf("list of users: %s\n", list);
  printf("Choice -- ? ");

  /* scanf("%s", &choice); */
  /* fgets(choice, 20, stdin); */

}


int main()
{
  char choice[20];
  char * list = "marco:dario:roberto:franco";

  print_choice(list, choice);
  printf("choice = %s\n", choice);

  return 0;
}

如果我使用fgets printf 会在stdout上正确打印结果;

如果我使用scanf printf `不会在stdout上打印任何内容。

为什么会出现这种情况?

4 个答案:

答案 0 :(得分:3)

您使用了scanf("%s", &choice);,当char **期望scanf()时,会将char *传递给&

删除{{1}}。

如果您的编译器没有抱怨,您要么没有打开足够的警告,要么需要更好的编译器。

答案 1 :(得分:1)

更改

scanf("%s", &choice);

scanf("%s", choice);

答案 2 :(得分:1)

你必须使用

scanf("%s", choice);

而不是

scanf("%s", &choice);

答案 3 :(得分:0)

将此scanf("%s", &choice);更改为此scanf("%s", choice);会导致scanf和fgets显示几乎相似的行为。

scanf需要地址作为参数。它根据提供的格式说明符转换后继续存储来自stdin的输入。这里的格式说明符是%s,因此它会尝试将输入存储在选择地址指向的地址。你需要的是选择数组开始的地址,在这种情况下就是选择本身。