我正在尝试用 C 编写一个程序,程序将逐个字符地浏览文件并将它们打印到控制台。但是,在运行下面的代码时,我收到错误Segmentation fault: 11
.我的代码中的问题在哪里?
void readFile(char fileName);
int main(const int argc, char *argv[])
{
int status = 0;
for (int i = 1; i < argc; i++) {
readFile(*argv[i]);
}
exit(status);
}
void readFile(char fileName)
{
FILE* file;
char c;
file = fopen(&fileName, "r");
do {
c = getc(file);
printf("%c", c);
if (!isalpha(c)) {
printf("n");
}
} while (c != EOF);
fclose(file);
}
你在很多层面上都做错了。您传递了i-th
参数的第0
个字符。你想要传递整个字符串。你需要通过char*
.
readFile(argv[i]);
您将此char*
直接传递给fopen
,然后检查其返回值。循环可以像
while( (c=getc(file)) != EOF){
}
...
fclose(file);
并且您必须使用int c
而不是char c
确保它可以保存getc
返回的所有值。
您的readFile
签名错误。
void readFile(char fileName);
readFile
函数需要单个字符,而不是字符串。*argv[i]
返回argv[i]
指向的字符串的第一个字母。
void readFile(const char *fileName)
{
FILE* file;
int c; // getc returns an int
file = fopen(fileName, "r");
// always check for errors
if(file == NULL)
return;
do {
c = getc(file);
printf("%c", c);
if (!isalpha(c)) {
printf("n");
}
} while (c != EOF);
fclose(file); // do not forget to close your streams.
}
请注意,您的do-while
循环是错误的,因为您应该首先检查c
是否EOF
。如果不是,则可以打印它。它应该是:
while((c = getc(file)) != EOF)
{
putc(c, stdout); // equivalent to printf("%c", c)
if(!isalpha(c))
puts(""); // equivalent to printf("n");
}
然后你可以这样称呼它:
int main(const int argc, char *argv[])
{
int status = 0;
for (int i = 1; i < argc; i++) {
readFile(argv[i]);
}
exit(status);
}
还要注意,getc
返回一个int
,而不是一个char
,所以c
变量必须是 一个int
.
男人的飞人
#include <stdio.h> int getc(FILE *stream);
描述
getc()
等效于fgetc()
,只是它可以作为多次评估流的宏实现。返回值
fgetc()
、getc()
和getchar()
将作为unsigned char
读取的字符返回到文件或错误末尾的int
或EOF
。
另请参阅此解释