为什么会显示运行时错误?

时间:2014-05-07 09:36:27

标签: c++ c

我正在编码以在发生此问题时创建我自己的scanf类型函数。以下代码在控制台中进行测试时效果很好。

#include <stdio.h>
#include <stdlib.h>

inline void fastint(int &x){
    register int c = getchar();
    x = 0;
    for(; ((c<48 || c>57) && c != '-'); c = getchar());
        for(; c>47 && c<58 ; c = getchar()){
            x = (x<<1) + (x<<3) + c - 48;
        }
}

inline void faststring(char * arr){
    register char c = getchar();
    register int i = 0;
    while (c < 33)
        c = getchar();
    while (c != '\n'){
        arr[i] = c;
        c = getchar();
        i = i + 1;

    }
        arr[i] = '\0';
}

int main(){
    int i;
    char * arr = (char*)malloc(20*sizeof(char));
    fastint(i);
    printf("number is %d\n",i);
//  fprintf(stderr, "new format %d\n", that_pesky_x);
        fastint(i);
    printf("number is %d\n",i);
        fastint(i);
    printf("number is %d\n",i);
        fastint(i);
    printf("number is %d\n",i);
        fastint(i);
    printf("number is %d\n",i);

    faststring(arr);
    printf("string is %c\n",arr[3]);

        faststring(arr);
    printf("string is %c\n",arr[3]);

        faststring(arr);
    printf("string is %c\n",arr[3]);
        faststring(arr);
    printf("string is %s\n",arr);
        faststring(arr);
    printf("string is %s\n",arr);
        faststring(arr);
    printf("string is %s\n",arr);

    return 0;
}

但是当在一个文本文件(名为input.txt)上测试上述代码时,其内容为:

12
32
12
42
343
hello dear
how is life
it is good man
Yes, it is the one
Have been search for this
Really, it is the only one

并尝试使用windows命令将输出保存到另一个文本文件(output.txt) new_scan.exe <input.txt> output.txt 在Windows中它显示new_scan.exe has stopped working

可能这是由于分段错误,但我无法弄清楚。请帮忙解决它。

提前致谢!

2 个答案:

答案 0 :(得分:4)

首先,您需要增加数组大小,因为您的一些测试用例超过20个字节。

第二,因为您正在阅读文件,因此您需要检查EOF。 所以改变

while (c != '\n'){
//  Do some work
}

while (c != '\n' && c != EOF){
// Do some work.
}

最后,您需要释放已分配的内存以获得良好实践。

现在你的代码应该可以正常工作。

答案 1 :(得分:2)

您的数组大小为20字节,但文本文件中的句子长度超过20个字符(字节)。

访问未分配的内存可能导致SEG-Fault。

可能出现的另一个问题是行尾分隔符。您已将\n检查为EOL,但其格式可以是\r\n(CR-LF组合)。所以你也要检查\r作为分隔符。

另外,建议您,您必须free使用'alloc系列函数分配的内存。