【问题标题】:Simple program using strings使用字符串的简单程序
【发布时间】:2013-09-30 11:00:31
【问题描述】:

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

【问题讨论】:

  • 你还有一些问题。第一个是您正在创建一个指针数组而不是字符。第二个是你应该使用 sizeof 而不是幻数。
  • 另外,请不要在您的问题中“回答”您的问题。

标签: c string c11 tr24731


【解决方案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;
}

【讨论】:

  • 其实它在 ISO C11 标准中,但是作为一个可选组件。
【解决方案2】:

行:

char *name[20];

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

char name[20];

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

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

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

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

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

请记住,附件 K(边界检查接口)中的内容是标准的可选部分。如果您无法使用它,则可以使用 another way 获取用户输入,它还处理的不仅仅是停止溢出(它检测并调整,而不仅仅是防止)。

【讨论】:

  • 感谢您的帮助:)
猜你喜欢
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多