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

The asterisk when applied before a pointer in C dereferences the pointer, i.e. it evaluates to whatever the pointer points at. You don't want that, you want:

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

Otherwise you're passing a single character (the first character in filename) to fopen(), which expects a pointer to a 0-terminated array of characters (aka "a string").

于 2013-02-20T14:03:34.890 に答える
0

mainは、引数を取らないか、または として宣言する必要があります(int argc, char* argv[])。そして、通常は EXIT_SUCCESS または EXIT_FAILURE のいずれかで、[0,255] の int を返す必要があります。

その後、コンパイラ ( 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 に答える
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 に答える