为什么这不编译?看不到错误
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *c;
FILE *f = fopen("file.txt", "r");
if(f == NULL) {
printf("Could not open file");
}
while((c = fgetc(f)) != EOF) {
if(strcmp(c, " ") == 0) {
printf(" ");
} else if(strcmp(c, ":") == 0) {
printf(":");
} else if(strcmp(c, "@") == 0) {
printf("@");
} else if(strcmp(c, "\n") == 0) {
printf("\n");
} else {
printf("Not a valid char");
}
}
}
答案 0 :(得分:11)
fgetc
将当前在文件指针处的char作为整数返回。
因此char *c;
应为int c;
和
if(strcmp(c, " ") == 0) {
应该是
if(c == ' ') {
同样改变其他比较。
您可以将比较压缩为:
while((c = fgetc(f)) != EOF) {
if(c == ' ' || c == ':' || c == '@' || c == '\n') {
printf("%c",c);
} else {
printf("Not a valid char");
}
}
答案 1 :(得分:0)
因为char *
不是char
。
fgetc
函数返回一个字符,而不是字符串。这意味着您的整个if
语句组也是错误的。你应该做一些简单的事情:
if( c == ' ' ) {
} else if( c == ':' ) {
} ...
答案 2 :(得分:0)
是的,fgetc()返回int,而不是char或char *。为什么这很重要?因为EOF通常(总是?)定义为-1。如果fgetc()将EOF返回到8位字符,则表示为0xFF。在某些字符集中,这是一个有效的字符。例如y-umlaut在ISO-8859-1中。因此使用
char c; // << this is wrong, use int
while((c = fgetc(aFile)) == EOF)
{
// stuff
}
您无法区分文件末尾和可合法显示在流中的其中一个字符。
答案 3 :(得分:-1)
如前所述,fgetc返回的int实际上并不是一个字符串(所以strcmp会失败)。我个人更喜欢虽然不是真的有任何不同的字符比较方法是使用一个开关,并且因为你有几个打印输入字符你可能有类似的东西:
while( (c = fgetc(f)) != EOF ) {
switch( c )
{
case ' ':
case ':':
case '@':
case '\n':
printf( "%c", c );
break;
default:
printf( "Not a valid char" );
}
}
我发现这是最简单的方法,特别是当你知道你以后想要扩展你的条件时。 (如果你想添加:'f','o'和'r')