0

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

2 回答 2

3

该行:

char *name[20];

创建一个包含 20 个字符指针的数组。你可能的意思是:

char name[20];

在任何情况下,主要问题是缓冲区溢出,并且根据 C 标准的以下摘录(我的粗体)scanf("%s")已修复:scanf_sC11 K.3.5.3.2 The fscanf_s function /4

fscanf_s 函数等效于 fscanf,除了 c、s 和 [ 转换说明符适用于一对参数(除非分配抑制由 * 指示)。

这些参数中的第一个与 fscanf 相同。该参数在参数列表中紧跟第二个参数,其类型为 rsize_t,并给出数组中由该对的第一个参数指向的元素的数量。如果第一个参数指向一个标量对象,它被认为是一个元素的数组。

所以正确的形式是这样的:

scanf_s ("%s", name, sizeof name);

请记住,附件 K(边界检查接口)中的内容是标准的可选部分。如果它对您不可用,还有另一种获取用户输入的方法,它还处理的不仅仅是停止溢出(它检测和调整而不是仅仅防止)。

于 2013-09-25T02:01:58.363 回答
1

scanf_s 是微软的 api。您应该使 IDE 符合 VS,或者您使用的是 microsoft 库。此外,你应该使用 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;
}
于 2013-09-25T02:37:12.260 回答