我不知道以下代码有什么问题。也许scanf_s
不会扫描字符串名称。
int main(void)
{
char *name[20];
printf("What is your name>");
scanf_s("%s", name);
printf("Your name is %s\n", name);
return 0;
}
我改了它但它仍然不起作用:
char *name[20];
{
printf("What is your name>");
scanf_s("%19s", name);
printf("Your name is %s\n", name);
return 0;
}
是的以下作品谢谢!!!!!!
int main(void)
{
char *name[20];
printf("What is your name>");
scanf_s("%s", name, 20);
printf("Your name is %s\n", name);
return 0;
}
答案 0 :(得分:3)
该行:
char *name[20];
创建一个包含二十个字符指针的数组。你可能意味着:
char name[20];
在任何情况下,scanf("%s")
的主要问题是缓冲区溢出,并且根据以下C标准的摘录scanf_s
(我的粗体)修复了C11 K.3.5.3.2 The fscanf_s function /4
:< / p>
fscanf_s函数等同于fscanf,除了c,s和[转换说明符适用于一对参数(除非赋值抑制用*表示)。
这些参数中的第一个与fscanf相同。 该参数在参数列表中紧跟第二个参数,其类型为rsize_t,并给出该对的第一个参数指向的数组中元素的数量。如果第一个参数指向标量对象,它被认为是一个元素的数组。
所以正确的形式是这样的:
scanf_s ("%s", name, sizeof name);
请记住,附件K(边界检查接口)中的内容是标准的可选部分。如果您无法使用,则another way可以获得用户输入,这不仅可以处理停止溢出(它会检测并调整而不仅仅是阻止)。
答案 1 :(得分:1)
scanf_s是microsoft api。您应该使IDE符合VS,或者您使用的是Microsoft libary。 此外,你应该使用char name [20];
int main(void){
char name[20];
printf("What is your name>");
scanf_s("%s", name);
printf("Your name is %s\n", name);
return 0;
}