下面的程序给出所需的输出(计算3行的单词)但它给出"运行时检查失败 #2 - 变量'str'周围的堆栈已损坏"并挂起。我试过了,但找不到解决方案。谢谢
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int i,count=0;
int main(void){
char str[3][1000];
char *ptr;
//Get user input
puts("Enter three lines:");
for (i = 0; i < 3; i++)
{
gets(&str[i][1000]);
}
for (i = 0; i < 3; i++)
{
ptr=strtok(&str[i][1000]," ");
count++;
while (ptr!=NULL)
{
ptr=strtok(NULL, " ");
if (ptr!=NULL)
{
count++;
}
}
}
printf("%d words", count);
getch();
}
这一行gets(&str[i][1000]);
应该是
gets(str[i]);
但是由于gets()
已被弃用,因此您确实应该使用
fgets (str[i], 1000, stdin);
此行上出现类似的错误ptr=strtok(&str[i][1000]," ");
通过将 &str[2][1000](循环的第三次迭代)传递给 gets/strtok,这实际上指向超出数组边界的 str[3],从而破坏堆栈。你应该简单地将str[i]或&str[i][0]传递给gets/strtok。
这个:
gets(&str[i][1000]);
是非常错误的,它gets()
给了每行最后一个字符的指针,其中(对于最后一行)没有更多的空间。
它应该是:
if(fgets(str[i], sizeof str[i], stdin) == NULL)
{
fprintf(stderr, "**Failed to read line %dn", i);
exit(1);
}
请注意,fgets()
更安全,您应该避免使用 gets()
.您还应该检查返回值以确保它成功。