我知道使用 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上打印任何内容。
为什么会出现这种情况?
答案 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,因此它会尝试将输入存储在选择地址指向的地址。你需要的是选择数组开始的地址,在这种情况下就是选择本身。