我正在编码以在发生此问题时创建我自己的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
。
可能这是由于分段错误,但我无法弄清楚。请帮忙解决它。
提前致谢!
答案 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
系列函数分配的内存。