Visual C ++的奇怪错误

时间:2011-05-14 16:30:48

标签: c++ c visual-c++

好吧,到目前为止这是我的代码

int main()
{
    char buffer[10];
    int arraySize = -1;
    FILE *fp;
    int i;  
    char filename[10];
    int userNo = 1;
    char stockArray[18][15];
    sprintf(filename, "file%d", userNo);
    fp = fopen(filename, "r");
    while(fgets(buffer, 30, fp) != NULL)
    { 
        if(buffer[0] == '<' && buffer[1] == 's')
        {
            arraySize++;
        }
        else if(buffer[0] == '<' && buffer[1] == '/'){printf("< char\n");}
        else
        {
            int t = 0;
            int r = 0;
            while(buffer[t] != '>')
            {
                t++;
            }
            t++;
            char holder[15] = {'\0'};
            while(buffer[t] != '<')
            {
                holder[r] = buffer[t];
                t++;
                r++;
            }
            strncpy(stockArray[arraySize], holder, r);
            printf("%s\n", stockArray[arraySize]);
        }
    }
    fclose(fp);
}

我遇到了两个奇怪的问题。首先,当我执行printf语句时,它会正确打印正确的数据,然后执行以下操作:如果第一个单词是“banana”而下一个单词是“123”则打印“123ana”然后是一堆奇怪的字符结束了,我哄骗你,一个笑脸。

然后,在程序完成并完成后,我得到“运行时检查失败#2 - 变量'文件'周围的堆栈已损坏。”错误。

我正在使用VS2010和C ++,到目前为止我所有的经验都来自GCC和C,我以前从未遇到过这些问题。任何建议将不胜感激

3 个答案:

答案 0 :(得分:7)

您的输入缓冲区长度为10个字符

char buffer[10];

但是你告诉fgets最多可以读取30个字符进入缓冲区

fgets(buffer, 30, fp)

这可能会产生“有趣”的效果!

答案 1 :(得分:2)

我在视觉检查中认识到的一件事是你的holder没有正确地以空值终止。您可以添加一行

holder[r++] = '\0';

在你的while循环之后。

答案 2 :(得分:0)

很难指出问题,而不了解你究竟在做什么,以及文件包含的内容。

但我仍然建议一件事并尝试:

strncpy(stockArray[arraySize], holder, r);
stockArray[arraySize][r] = '\0'; //do this before printf!

通常,确保所有c字符串都以空值终止。否则你将面临由于缺乏空字符而产生的常见问题。