0

下面的程序给出了所需的输出(计算 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();

}
4

3 回答 3

2

这条线gets(&str[i][1000]);应该是

 gets(str[i]);

但是由于gets()已弃用,您应该真正使用

fgets (str[i], 1000, stdin);


此行出现类似错误ptr=strtok(&str[i][1000]," ");

于 2013-09-12T14:19:36.167 回答
2

您通过将 &str[2][1000](第三次循环迭代) 传递给 get/strtok 来破坏堆栈,它实际上指向 str[3] 超出数组范围。您应该简单地将 str[i] 或 &str[i][0] 传递给gets/strtok。

于 2013-09-12T14:23:35.807 回答
1

这个:

gets(&str[i][1000]);

非常错误,它给出gets()了一个指向每行最后一个字符的指针,其中(对于最后一行)没有更多的空间。

它应该是:

if(fgets(str[i], sizeof str[i], stdin) == NULL)
{
  fprintf(stderr, "**Failed to read line %d\n", i);
  exit(1);
}

请注意,这样fgets()更安全,您应该避免使用gets(). 您还应该检查返回值以确保它成功。

于 2013-09-12T14:22:23.190 回答