2013-02-20 2 views
0

Я программирую на 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 является линией с, если заявление

#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);' –

+3

Кроме того, вы используете 'feof' неправильно. http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong –

+1

Кроме того, main должен возвращать нулевой (или EXIST_SUCCESS) успех. (и EXIT_FAILURE ON) – wildplasser

ответ

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[]). И он должен вернуть int в [0,255], как правило, либо 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) { 
    .... 
Смежные вопросы