我正在用C编程,我开始在文件中做一些像wordcount这样的基本编程,但不幸的是我的程序执行中存在缺陷。 gcc编译器显示这样一个警告:
test.c: In function ‘main’:
test.c:11: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast
/usr/include/stdio.h:269: note: expected ‘const char * __restrict__’ but argument is of type ‘char’
第11行是if语句
的行#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define FAIL -1
#define SUCCESS 1
int main (char *filename) {
FILE *fp;
char c;
int wordcount = 0;
if ((fp = fopen(*filename,"r")) == NULL)
return FAIL;
while (!feof(fp))
{
while(!isalpha(fgetc(fp)))
{
wordcount++;
}
}
printf("wordcount: %d",wordcount);
fclose(fp);
return SUCCESS;
}
答案 0 :(得分:5)
在C 取消引用指针之前应用星号时的星号,即它评估指针指向的任何内容。您不希望如此:
if ((fp = fopen(filename,"r")) == NULL)
否则你将一个字符(filename
中的第一个字符)传递给fopen()
,它需要一个指向0终止字符数组(又名“字符串”)的指针。 / p>
答案 1 :(得分:0)
int main( int argc, char **argv )
{
FILE *fp;
char *path;
path = argc > 1 ? argv[1] : "default"
fp = fopen( path, "r" );
if( fp == NULL ) {
perror( path );
exit( EXIT_FAILURE );
}
...
答案 2 :(得分:0)
main
必须声明为不参数或(int argc, char* argv[])
。它必须在[0,255]中返回一个int,通常是EXIT_SUCCESS或EXIT_FAILURE。
之后,在编译器中启用警告(gcc -Wall -Werror
),看看它是如何发生的。
答案 3 :(得分:0)
通过在文件名前面添加'*',您将数据文件名点传递给而不是存储数据的地址 - 应该是:
if ((fp = fopen(filename,"r")) == NULL)
主only takes the arguments argc和argv。如果您将文件名作为命令行的第一个参数传递,则:
int main (int argc, char* argv[])
{
FILE *fp;
char c;
int wordcount = 0;
if (argc<1) {
fprintf(stderr, "need a filename");
return FAIL;
}
if ((fp = fopen(argv[1],"r")) == NULL) {
....