1

私は C が初めてで、プログラムの実行時に引数として与えられた文の単語をカウントするプログラムを作成しようとしています。' '単語は、 、'\n'','またはのいずれかで区切られた 1 文字または複数の文字'.'です。例: ./words abc abc=2 words

しかし、私は取得し続けます: " segementation fault(core dumped)"。以下はコードです:

int main(char **argv) 
{
    char buf[80];   
    sprintf(buf,"%d words\n",words(argv));
    write(1,buf,strlen(buf));
    return 0;
}

int words(char **argv)
{
    int i=0, sum=0;
    while(argv[i] != '\0')
    {
         if(argv[i] == '.' || argv[i] == ',' || argv[i] == ' ' || argv[i] == '\n')
             sum++;
         i++;
    }

}
4

4 に答える 4

1
me.c:2:5: warning: first argument of âmainâ should be âintâ [-Wmain]
me.c:2:5: warning: âmainâ takes only zero or two arguments [-Wmain]
me.c: In function âmainâ:
me.c:4:1: warning: implicit declaration of function âwordsâ [-Wimplicit-function-declaration]
me.c:5:1: warning: implicit declaration of function âwriteâ [-Wimplicit-function-declaration]
me.c:5:1: warning: implicit declaration of function âstrlenâ [-Wimplicit-function-declaration]
me.c:5:13: warning: incompatible implicit declaration of built-in function âstrlenâ [enabled by default]
me.c: In function âwordsâ:
me.c:11:16: warning: comparison between pointer and integer [enabled by default]
me.c:11:33: warning: comparison between pointer and integer [enabled by default]
me.c:11:51: warning: comparison between pointer and integer [enabled by default]
me.c:11:69: warning: comparison between pointer and integer [enabled by default]

gcc -Wall filename.c上記のすべての警告が生成されます

これらはコード内の警告です。すべてを避けてください。そして試してみてください。

Googleで検索して、これらの回答を見つけてください

how to use command line arguments

how to declare a function

how to compare strings and how '.' is differ from "."

于 2013-09-28T19:04:20.063 に答える
1

Argv は、**char または文字列の配列へのポインタです。あなたのコードはそれを単一の文字列であるかのように扱っているため、文字列へのポインタをループしてカウントしています。これらのポインターはいずれも null ではないため、プログラムは配列の末尾を超えて続行し、セグメンテーション フォールトが発生します。

于 2013-09-28T18:57:14.447 に答える
1

1.argv を反復処理します。(これは char へのポインターであり、実行中のプログラムの名前を保持し、argv の最後の要素はポインター
であることを念頭に置いてください。ライブラリーの関数を使用して で分割します(strtok が NULL 以外の値を返すたびに、単語カウントをインクリメントします)。 コマンドライン引数と strtok を読むと、渡された任意の引数で簡単に動作させることができます。argv[i]argv[0]NULL
2.strtokstring.hargv[i]" .,\n"


于 2013-09-28T20:54:06.647 に答える
1

私が間違っていなければ、引数は自動的に別々の文字列に分割されます。これが、ポインターへのポインターを取得する理由です (たとえば、char **の代わりにchar*)。argv 配列を一度だけ逆参照しています。これを試して:

while(argv[i] != NULL) {
    i++;
}

第二に、定義上、引数に改行を渡すことができないため、改行をそのように検出することはできません。おそらくやりたいことは、stdin からの入力を解析して、次のようにプログラムを呼び出すことです。

echo "abc abc" | ./words

また

./words < SOME_TEXT_FILE

最後になりましたが、words 関数は何も返さないため、i を返す必要があります。

int words(char** argv) {
    //...
    return i;
}

words()戻り値が NULL になり、sprintf が関数の結果を逆参照しようとするため、これがおそらくプログラムのセグメンテーション違反の理由です。したがって、関数全体は次のようになります。

int words(char** argv) {
    int counter = 0;
    while(char[i] != NULL) {
        int j = 0;
        while(char[i][j] != '\0') {
            if(char[i][j] == '.') { //no need to check for '\n'...
                counter++;
            }
            j++;
        }
        i++;
        counter++;
    }
    return counter;
}
于 2013-09-28T19:01:26.387 に答える