[英]“scanf with printf” vs “fgets with printf”
我知道使用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上打印任何内容。
为什么这种行为?
您使用了scanf("%s", &choice);
当期望char *
时,将char **
传递给scanf()
。
删除&
。
如果您的编译器没有抱怨,那么您要么没有打开足够的警告,要么需要更好的编译器。
更改
scanf("%s", &choice);
至
scanf("%s", choice);
你必须使用
scanf("%s", choice);
代替
scanf("%s", &choice);
更改此scanf("%s", &choice);
到这个scanf("%s", choice);
将导致scanf和fgets表现出几乎相似的行为。
scanf需要一个地址作为参数。 根据提供的格式说明符将其转换后,它将继续并存储来自stdin的输入。 此处的格式说明符为%s,因此它将尝试将输入存储在选择地址所指向的地址处 。 您需要的是选择数组的起始地址,在这种情况下,这就是选择本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.