需要帮助来理解我的程序中的缺陷

时间:2013-02-20 14:01:44

标签: c file

我正在用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;
}

4 个答案:

答案 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) {
   ....