这是代码:
#include <stdio.h>
int main(void)
{
char words[256];
char filename[64];
int count = 0;
printf("Enter the file name: ");
scanf("%s", filename);
FILE *fileptr;
fileptr = fopen(filename, "r");
if(fileptr == NULL)
printf("File not found!\n");
while ((fscanf(fileptr, " %s ", words))> 0)
{
if (words==' ' || words == '\n')
count++;
}
printf("%s contains %d words.\n", filename, count);
return 0;
}
我一直收到这个错误:
warning: comparison between pointer and integer [enabled by default]
if (words==' ' || words == '\n')
^
我改变后,words
转到*words
但我没有收到错误,但这并没有给我正确的结果。我正在尝试计算文件中的单词数。
答案 0 :(得分:1)
单词是char指针,而' '
是char,*单词等于单词[0]
通常我们会在下面定义一个新指针
char *p = words;
while(*p != '\0' )
{
// using *p something you need to do
p++;
}
答案 1 :(得分:1)
无需进行比较,因为%s
(words
)不包含空格(例如' '
或'\n'
)。
试试这个
while (fscanf(fileptr, "%s", words)> 0) {
count++;
}
答案 2 :(得分:0)
C中没有string
。每个字符串(/ literal)都是一个字符数组。使用strcmp
答案 3 :(得分:0)
注意使用数组名称单词本身意味着指向数组中第一个元素的指针。如果您需要比较C中的2个字符串,那么 strcmp 就是您要找的。 p>
答案 4 :(得分:0)
您无法比较C
中的字符串。您应该使用标准库函数strcmp
逐个字符地比较它们。这是它的原型包含在string.h
标题中。
int strcmp(const char *s1, const char *s2);
strcmp
函数会比较两个字符串s1
和s2
。如果找到s1
,则返回小于,等于或大于零的整数,小于,匹配或大于s2
。
fscanf " %s "
的格式字符串(注意尾随和前导空格)将读取并丢弃任何数量的空格,无论如何都使用格式字符串"%s"
。这意味着words
不会将空格写入缓冲区fscanf
。 fscanf
将只在words
中写入非空白字符,并在遇到空格时返回。因此,要计算单词数量,只需为每次成功的fscanf
调用增加计数器。
此外,您的程序应检查scanf
和fscanf
调用中是否存在缓冲区溢出。如果输入字符串对于缓冲区来说太大,那么这将导致未定义的行为,甚至由于段错误而导致崩溃。您可以通过更改格式字符串来防范它。 scanf("%63s", filename);
表示scanf将从stdin
读取,直到遇到空格并在缓冲区63
中写入大多数filename
个非空格字符,然后在其中添加一个终止空字节结束。
#include <stdio.h>
#include <string.h>
int main(void) {
// assuming max word length is 256
// +1 for the terminating null byte added by scanf
char words[256 + 1];
// assuming max file name length is 64
// +1 for the terminating null byte
char filename[64 + 1];
int count = 0; // counter for number of words
printf("Enter the file name: ");
scanf("%64s", filename);
FILE *fileptr;
fileptr = fopen(filename, "r");
if(fileptr == NULL)
printf("File not found!\n");
while((fscanf(fileptr, "%256s", words)) == 1)
count++;
printf("%s contains %d words.\n", filename, count);
return 0;
}