0

我正在用 C 编程,我开始做一些基本的编程,比如文件中的字数,但不幸的是,我的程序执行存在缺陷。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;
}
4

4 回答 4

5

在 C 中的指针之前应用星号会取消对指针的引用,即它计算指针指向的任何位置。你不想要那个,你想要:

if ((fp = fopen(filename,"r")) == NULL)

否则,您将单个字符( 中的第一个字符filename)传递给fopen(),它需要一个指向以 0 结尾的字符数组(又名“字符串”)的指针。

于 2013-02-20T14:03:34.890 回答
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 );
  }
  ...
于 2013-02-20T14:04:33.120 回答
0

main必须声明为不带参数或(int argc, char* argv[]). 它必须在 [0,255] 中返回一个 int,通常是 EXIT_SUCCESS 或 EXIT_FAILURE。

之后,在您的编译器 ( gcc -Wall -Werror) 中启用警告并查看它是如何进行的。

于 2013-02-20T14:05:19.453 回答
0

通过在文件名前加上“*”,您将数据文件名指向而不是存储数据的地址传递 - 应该是:

if ((fp = fopen(filename,"r")) == NULL)

而 main只接受参数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) {
   ....
于 2013-02-20T14:06:12.167 回答