C-函数的错误冲突类型
我是C语言的新手。我试图从用户那里获取大量文本,并计算单词、字符、行、空格和字母的数量。这就是我所做的:C-函数的错误冲突类型,c,C,我是C语言的新手。我试图从用户那里获取大量文本,并计算单词、字符、行、空格和字母的数量。这就是我所做的: #include <ctype.h> #include <stdio.h> int main(void) { char c = getchar(); char previousc; int charcount = 0; int wordcount = 0; int whitespacecount = 0; int lin
#include <ctype.h>
#include <stdio.h>
int main(void)
{
char c = getchar();
char previousc;
int charcount = 0;
int wordcount = 0;
int whitespacecount = 0;
int linecount = 0;
int lettercount = 0;
while(c != EOF)
{
if(isLetter(c) == 1) lettercount++;
if(isWhitespace(c) == 1)
{
whitespacecount++;
if(isWhitespace(previousc) == 0) wordcount++;
}
if(c == "\n") linecount++;
previousc = c;
c = getchar();
charcount++;
}
printf("Character Count: %d\n Word Count: %d\n Whitespace Count: %d\n Letter Count: %d\n Line Count: %d\n", charcount, wordcount, whitespacecount, linecount, lettercount);
}
int isLetter(char c) // 1 for true, 0 for false.
{
// instead of writing tons of if's
if(isalpha(c) > 0)
return 1;
return 0;
}
int isWhitespace(char c) // 1 for true, 0 for false.
{
if(c == "\n" || c == " " || c == " ") return 1;
return 0;
}
我用谷歌搜索了不同的错误,但没有找到解决问题的方法
你能帮我一点忙吗
谢谢。从第一个错误/警告开始,修复它,然后逐个解决,每次更改后都要编译。通常,您会发现,删除一行中的错误/警告也会删除后续行中的其他错误/警告 第20行:
if(c == "\n") linecount++;
发出警告
program2.c:20: warning: comparison between pointer and integer
c
是字符(在比较之前内部转换为整数)“\n”
是char
的数组[2](在比较之前内部转换为char*
。这就是编译器抱怨比较整数和指针的原因 您需要将
c
与一个字符进行比较(两者都将在内部转换为整数)
为了
program2.c:20:警告:指针和整数之间的比较
改变
if(c == "\n")
if(c == "\n" || c == " " || c == " ") return 1;
到
为了
program2.c:28:错误:“Isleter”的类型冲突program2.c:28:注意:具有默认升级的参数类型不能与空参数名称列表声明匹配
program2.c:14:错误:前面的“Isleter”隐式声明在此
program2.c:35:错误:“isWhitespace”的类型冲突
program2.c:35:注意:具有默认升级的参数类型不能与空参数名称列表声明匹配 program2.c:15:error:前面的“isWhitespace”隐式声明在这里 为您的函数定义原型
int isLetter(char c);
int isWhitespace(char c);
为了
program2.c:在函数“isWhitespace”中:程序2.c:36:警告:指针和整数之间的比较
程序2.c:36:警告:指针和整数之间的比较
程序2.c:36:警告:指针和整数之间的比较 改变
if(c == "\n")
if(c == "\n" || c == " " || c == " ") return 1;
到
- 在调用以下函数之前声明它们(即,在函数
上方):main
int-isleter(字符c)代码>
int是空格(charc)代码>
- 在函数
中:main
- 将变量声明
替换为char c
int c
- 将函数调用
替换为isLetter(c)
isLetter((char)c)
- 将函数调用
替换为isWhitespace(c)
isWhitespace((char)c)
- 将变量赋值
替换为previous=c
previous=(char)c
- 将条件语句
替换为if(c==“\n”)
if((char)c=='\n')
- 将变量声明
int c
,是因为函数getchar
返回int
,以支持EOF
指示器
- 在function
中,将条件语句更改为:isWhitespace
if(c=''| | c='\n'| | c='\r'| | c='\t')
EOF
是一个整数值,表示输入结束。它的值使得对于任何字符ch
,ch==EOF
始终为false。因此,您应该始终将int
类型的值与EOF
进行比较,而不是将char
类型进行比较。它在您的机器上工作是因为char
类型被实现为signed char
,但是在char
类型为unsigned char
的机器上,这不会发生
现在来看警告和错误
main
中的isleter
等函数“\n”
是字符串文字,而不是字符。“
和”
也是如此。这里的字符串文本的计算结果是指向其第一个元素的指针,您正在将该指针与另一个字符(另一种类型)进行比较。相反,您应该分别与'\n'
,'
,'\t'
进行比较在main中使用函数头之前,必须先声明函数头,例如:
int isLetter(char c);
int main(void){
char c = getchar();
char previousc;
int charcount = 0;
int wordcount = 0;
int whitespacecount = 0;
int linecount = 0;
int lettercount = 0;
while(c != EOF)
{
if(isLetter(c) == 1) lettercount++;
if(isWhitespace(c) == 1)
{
whitespacecount++;
if(isWhitespace(previousc) == 0) wordcount++;
}
if(c == "\n") linecount++;
previousc = c;
c = getchar();
charcount++;
}
printf("Character Count: %d\n Word Count: %d\n Whitespace Count: %d\n Letter Count: %d\n Line Count: %d\n", charcount, wordcount, whitespacecount, linecount, lettercount);}
这将修复冲突类型错误。
但是,如果您要检查字符,您还必须将“”更改为“”。将
c==“\n”
更改为c=='\n'
@ouah,谢谢,这解决了指针和整数之间的比较问题。请在使用函数之前声明它们。因此,要么将isleter
和isWhitespace
的原型放在main
之前,要么将函数一起移动。另外,您可能需要查看函数中的一些函数isWhitespace
将不起作用!您还可以将char
与char*
进行比较。我会像int-isWhitespace(charc){return(c=='')| |(c='\t')| |(c='\n');}
这样写它。当然,应该用原型来声明函数。否则,他们说,编译器将执行隐式声明,假设返回类型为int。但在这种特定情况下,这是完全正确的!那么为什么会出现错误呢?编译器在第14行推断出了什么隐式声明?欢迎使用SO。请你强调一下,你的答案与这篇2年前的文章中已有的答案有什么不同或不同?
if(c == '\n' || c == ' ' || c == '\t')
int isLetter(char c);
int main(void){
char c = getchar();
char previousc;
int charcount = 0;
int wordcount = 0;
int whitespacecount = 0;
int linecount = 0;
int lettercount = 0;
while(c != EOF)
{
if(isLetter(c) == 1) lettercount++;
if(isWhitespace(c) == 1)
{
whitespacecount++;
if(isWhitespace(previousc) == 0) wordcount++;
}
if(c == "\n") linecount++;
previousc = c;
c = getchar();
charcount++;
}
printf("Character Count: %d\n Word Count: %d\n Whitespace Count: %d\n Letter Count: %d\n Line Count: %d\n", charcount, wordcount, whitespacecount, linecount, lettercount);}