gpt4 book ai didi

c - 运行时错误 #2 - S

转载 作者:行者123 更新时间:2023-11-30 16:45:41 25 4
gpt4 key购买 nike

EDIT: This is the error I am getting.程序完美运行后出现此错误,我不知道为什么。我试图将字符串添加到临时变量中,然后将它们添加到结构数组中,名称临时值空间为 15,然后检查名称是否超过 15 个字符,并要求用户重新输入字符串(如果为 true)。可能是因为输入 name var 时有缓冲区,但我不知道。

typedef struct {
char name[15];
int score;
int riskF;
} player_info;

int main()
{
player_info players[20];
char name[15];
int gameN = 0;
int riskF = 0;
int accScore = 0;
int totalplayers = 0;
int count = 1;
int length = 0;
int maxName = 15;

printf_s("Enter player %d: ", count);
scanf_s("%s", name, 999);

length = strlen(name);
if (length < maxName)
{
strcpy_s(players[totalplayers].name, name);
totalplayers++;
count++;
}
else
{
printf_s("\nName too big; please enter a name within 15 characters!\n\n");
}
length = 0;



printf_s("done!");
return 0;
}

最佳答案

至少有两个问题是显而易见的。第一个应该阻止成功编译,下一个更糟。

1) strcpy_s 的参数太少,其原型(prototype)如下:

errno_t strcpy_s(char *strDest, size_t numElements, const char *strSource);

你的陈述...

strcpy_s(players[totalplayers].name, name);

...似乎缺少中间参数 size_t numberOfElements, 因为这不是 strcpy_s 中的可选参数,所以您显示的代码不应编译。

2) 您的代码正在调用 undefined behaviour 。您已配置了 scanf_s函数读取的内容超出了变量 name 所能容纳的内容。除了代码中发生这种情况之外,无法告诉您的代码将如何表现。它可能会起作用一次,或者一百次,然后下一次就不起作用了。

char name[15];
....
int maxName = 15;


scanf_s("%s", name, 999);//name can contain only 14 characters and a NULL.
^^^ //you are allowing scanf_s to read more than that.

设置 scanf_s 的第三个参数以匹配您要写入的 char 数组的 size-1:

int maxName = 14;//and for same reason, change maxName 
scanf_s("%s", name, 14);//room for NULL
/// or a width specifier can be used
scanf_s("%14s", name, 15);
/// BEST of all, use a portable version: scanf with width specifier
scanf(("%14s", name); //provided similar protection.
//note: scanf has not be deprecated by anyone
//except Microsoft

无论哪种方式,如果 scanf_s 要防止缓冲区溢出,则必须正确设置参数。

关于您的评论:我之前将 999 缓冲区设置为 15,但如果输入超过 15 个字符,则会破坏我的代码

您需要为 NULL 终止符留出空间。 ( see this C string definition )
如果您用 15 个输入字符填充缓冲区,大小仅包含 15 个字符,则数组没有空间容纳 NULL 终止符。因此,char 数组不是 C 字符串,并且不能保证其行为与字符串相同。 (UB)。

关于c - 运行时错误 #2 - S,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com