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

我是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 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);}