使用字符串的简单程序

时间:2013-09-25 01:59:38

标签: c string c11 tr24731

我不知道以下代码有什么问题。也许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;
}

2 个答案:

答案 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;
}