C - 函数的错误冲突类型

时间:2014-03-16 12:42:38

标签: 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 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;
}

但我收到了很多错误和警告,我只是输了......

program2.c: In function ‘main’:
program2.c:20: warning: comparison between pointer and integer
program2.c: At top level:
program2.c:28: error: conflicting types for ‘isLetter’
program2.c:28: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
program2.c:14: error: previous implicit declaration of ‘isLetter’ was here
program2.c:35: error: conflicting types for ‘isWhitespace’
program2.c:35: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
program2.c:15: error: previous implicit declaration of ‘isWhitespace’ was here
program2.c: In function ‘isWhitespace’:
program2.c:36: warning: comparison between pointer and integer
program2.c:36: warning: comparison between pointer and integer
program2.c:36: warning: comparison between pointer and integer

我搜索了不同的错误,但没有找到解决我问题的解决方案。

你可以帮我一下吗?

感谢。

5 个答案:

答案 0 :(得分:4)

有关

  

program2.c:20:警告:指针和整数之间的比较

更改

 if(c == "\n")  

 if(c == '\n')  

对于

  

program2.c:28:错误:'isLetter'的冲突类型
  program2.c:28:注意:具有默认促销的参数类型不能与空参数名称列表声明
匹配   program2.c:14:错误:'isLetter'的先前隐式声明在这里   program2.c:35:错误:'isWhitespace'的冲突类型   program2.c:35:注意:具有默认促销的参数类型不能与空参数名称列表声明匹配   program2.c:15:错误:'isWhitespace'的先前隐式声明在这里

为您的功能定义原型。

int isLetter(char c);
int isWhitespace(char c);  

有关

  

program2.c:在函数'isWhitespace'中:
  program2.c:36:警告:指针和整数之间的比较
  program2.c:36:警告:指针和整数之间的比较
  program2.c:36:警告:指针和整数之间的比较

更改

if(c == "\n" || c == " " || c == "      ") return 1;

if(c == '\n' || c == ' ' || c == '\t') 

答案 1 :(得分:3)

从第一个错误/警告开始,修复它,然后在每次更改后逐个编译。通常,你会发现,在一行上摆脱错误/警告也会在后续行中删除其他行。

第20行:

            if(c == "\n") linecount++;

发出警告

program2.c:20: warning: comparison between pointer and integer

c是一个char(在比较之前内部转换为整数); "\n"char的数组[2](在比较之前内部转换为char *。)
这就是编译器抱怨比较整数和指针的原因。

您需要将c与一个字符进行比较(两者都将在内部转换为整数)

            if(c == '\n') linecount++;

答案 2 :(得分:2)

  • 在调用它们之前声明以下函数(即,在函数main之上):

    • int isLetter(char c);
    • int isWhitespace(char c);

  • 在函数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指标。


  • 在函数isWhitespace中,将条件语句更改为:

    • if (c == ' ' || c == '\n' || c == '\r' || c == '\t')

答案 3 :(得分:0)

EOF是一个整数值,表示输入结束。它是一个值,对于任何字符chch == EOF始终为false。因此,您应始终将int类型的值与EOF进行比较,而不是char类型。它在您的计算机上运行,​​因为char类型是signed char实现的,但在char类型为unsigned char的计算机上,这不会。<\ n / p>

现在出现警告和错误

  1. 函数的范围从定义或声明到程序结束。您在声明之前调用isLetter中的main函数。

  2. "\n"是字符串文字,而不是字符。 " "" "也是如此。这里的字符串文字计算为指向其第一个元素的指针,并且您将此指针与字符(不同类型)进行比较。相反,您应该分别与'\n'' ''\t'进行比较。

答案 4 :(得分:0)

在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);}

将修复冲突类型错误。 但是如果要检查字符,你还必须将“”更改为“。”