我正在尝试将char传递给函数,但这样做时会出错。这是我的主要功能
#include "maiello8_headers_P1.h"
int main()
{
int characterCount;
int wordCount;
int lineCount;
char fileName[20];
printf("Enter the name of the text file: ");
scanf("%s\n",fileName);
characterCount = countCharacters(fileName);
wordCount = countWords(fileName);
lineCount = countLines(fileName);
printf("Characters: %d\n", characterCount);
printf("Words: %d\n", wordCount);
printf("Lines: %d\n", lineCount);
return 0;
}
我得到的错误是
maiello8_main_P1.c: In function ‘main’:
maiello8_main_P1.c:20:35: warning: passing argument 1 of ‘countCharacters’ makes integer from pointer without a cast [-Wint-conversion]
20 | characterCount = countCharacters(fileName);
| ^~~~~~~~
| |
| char *
In file included from maiello8_main_P1.c:9:
maiello8_headers_P1.h:8:26: note: expected ‘char’ but argument is of type ‘char *’
8 | int countCharacters(char fileName);
| ~~~~~^~~~~~~~
但是当我将程序更改为characterCount = countCharacters(char fileName);或characterCount = countCharacters(char fileName);我收到一条错误消息:“ char之前的期望表达式。所以我不确定问题是否出在countCharacters函数的主函数中。这是countCharacters函数
#include "maiello8_headers_P1.h"
int countCharacters(char fileName)
{
char currentCharacter;
int numCharacters = 0;
FILE *fpt;
fpt = fopen(fileName,"r");
while((currentCharacter = fgetc(fileName)) != EOF)
{
if(currentCharacter != ' ' && currentCharacter != '\n')
numCharacter++;
}
fclose(fileName);
return numCharacter;
}
我正在为此程序使用Makefile,因此问题也可能出在标题为:
#ifndef pH
#define pH
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int countCharacters(char fileName);
int countWords(char fileName);
int countLines(char fileName);
#endif
抱歉,我投入了太多代码,但是我是C语言新手,已经花了几个小时来研究类似的问题,无法找到解决方案。
filename
毫无疑问是一个“字符串”:即字符数组:
char fileName[20];
(文件名的空间很小,您不认为吗?您的头文件名maiello8_headers_P1.h
长21个字符,因此数组中至少需要22个字符,并且假设您从未添加目录路径。更大一些。您的计算机中有数十亿字节的内存;为文件路径保留几千个不会浪费资金:-)但我离题了。]
在C中,您实际上无法将数组作为参数传递。您必须将指针传递给第一个元素。编译器通过自动将数组参数更改为指向数组中第一个元素的指针来帮助您解决此问题。这就是“衰减”,这是您迟早会遇到的术语。
因此,将使用指向filename
中第一个元素的指针来调用函数。该元素为char
,因此衰减参数的类型为char *
。但是您的标头声明:
int countCharacters(char fileName);
换句话说,标题表示countCharacters
的参数是单个字符。
声明函数时,C相信您所说的。因此,它期望您将使用单个字符来调用该函数。在C语言中,字符只是小整数,而小整数肯定不是您的函数所期望的。因此,编译器尝试通过删除除指针值的最后一个字节以外的所有字节,将指向filename
中第一个字符的指针缩小为一个小整数。由于这几乎肯定不是您想要的,编译器会警告您您可能正在做其他事情,而不是您想的。
您可以获得要求编译器警告的全部要点(如果您请求了警告,而不是获得为您提供帮助的Makefile。)编译器没有义务就此类事情警告您,即使它们实际上是合法的C没有任何意义,除非您明确要求,否则GCC不会提供警告。它是您在C编译器中发现的一些对人为弱点的让步之一,并且最好充分利用它。
简而言之,修复头文件和实现文件中的函数声明。一个不错的选择是
int countCharacters(const char* fileName);
它不仅具有正确的类型,而且还指示该函数将不会修改其参数所指向的字符的值。