我是编程和stackoverflow的新手,这就是为什么我有时可能会有简单的问题,当我编写代码并希望从文件中获取输入时
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len1=0;
FILE* p;
char a;
char b[10];
p = fopen(argv[1],"r");
while (1)
{
a = fgetc(p);
if(a == ' ') break;
else
{
len1++;
b[len1-1] = a;
}
}
printf("%c\n", b0);
return 0;
}
它给出了分段错误,原因是什么?
答案 0 :(得分:2)
您有缓冲区溢出。如果您在读取十个字符后将while
循环更改为停止,即使未达到 space ,也应该没问题。
此外,您将b[len1]
处的字符传递给printf
,并将其解释为作为指针。无论如何,这将是段错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int len1=0;
FILE* p;
char a;
char b[10+1]; // <<== need one more byte for the terminator
if (argc != 2)
{
fprintf(stderr, "Need to supply a filename\n");
return (-1);
}
p = fopen(argv[1],"r");
if (p == NULL)
{
fprintf(stderr, "Cannot open file %s\n", argv[1]);
return(-2);
}
while (len1 < 10) // <<== avoid buffer overruns
{
a = fgetc(p);
if(a == ' ') break;
else
{
len1++;
b[len1-1] = a;
}
}
b[len1] = '\0'; // <<== Don't forget to zero-terminate
printf("%s\n", b); // <<== Pass the buffer, not the last character from it
return 0;
}
答案 1 :(得分:0)
char b[10]
只有10个元素。 len1
在无限循环的每次迭代中递增。这很快就会变成&gt; 10.最后在10点左右你写入一些你也无法访问的内存。因此,seg故障。
答案 2 :(得分:0)
而不是while (1)
,你应该测试循环索引与表b的大小(所以10)
你想做什么?
答案 3 :(得分:0)
你有两个问题
printf
正在尝试打印字符串。 b[len1]
是一个角色。答案 4 :(得分:0)
你的程序中有两个逻辑错误::
1。while(1)
你有一个非终止循环,它将导致stackoverflow
2. char b[10]
这里,b是一个大小为10的char数组,即b[0] to b[9]
,但正如你的程序中len1++
正在为每次迭代执行,这将访问超出b[9]
的内存。
要解决这些问题,请使用while(len1<10)
。