我正在尝试在C中编写一个程序,程序将通过char查看文件char并将它们打印到控制台。但是,在运行下面的代码时,我收到错误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);
}
答案 0 :(得分:3)
你在许多层面做错了。您传递了0
参数的i-th
个字符。你想传递整个字符串。您需要通过char*
。
readFile(argv[i]);
您会将此char*
直接传递给fopen
,然后检查它的返回值。循环可以像
while( (c=getc(file)) != EOF){
}
...
fclose(file);
您必须使用int c
代替char c
,确保它可以保存getc
返回的所有值。
答案 1 :(得分:1)
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
。
man fgets
#include <stdio.h> int getc(FILE *stream);
<强>描述强>
getc()
等同于fgetc()
,但它可以实现为一个不止一次评估流的宏。返回值
fgetc()
,getc()
和getchar()
将字符作为unsigned char
广告投放回int
或{{1}在文件末尾或错误。