2013-02-20 49 views
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; 
} 
+2

'INT主(INT ARGC,字符** argv的);' – 2013-02-20 14:03:02

+3

此外,您使用的是'feof'不正确。 http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong – 2013-02-20 14:06:04

+1

此外,主要应在成功返回零(或EXIST_SUCCESS)。 (并且EXIT_FAILURE ON失败) – wildplasser 2013-02-20 14:08:10

回答

5

星号用C 解除引用指针之前当施加的指针的线,即,其结果为无论指针指向什么。你不希望出现这种情况,你想:

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

否则你传递一个字符(在filename的第一个字符)到fopen(),这需要一个指向字符0终结阵列(又名“一个字符串“)。

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); 
    } 
    ... 
0

main必须被声明为接受或者没有参数或(int argc, char* argv[])。它必须在[0,255]中返回一个int,通常是EXIT_SUCCESS或EXIT_FAILURE。

之后,能够在你的编译器(gcc -Wall -Werror)警告,并看看怎么回事。

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