-1

私はそのような単純な質問があります:ユーザーがキーボードからいくつかの単語を入力できるようにします。1行に1単語ずつ「。」まで入力します。(期間)入力してから結果を出力します。例:

Enter a word: word1
Enter a word: word2
Enter a word: .
You have entered 2 word(s):
word1
word2

OK、ここで試してみましたが、実行すると、最初の単語を入力させた後、ファイルが機能しなくなったと表示されました

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main () 
{ 
    char *word[50]; //each word has maximum 49 character
    int i=0, number_of_word;

    do
    {
        printf ("Enter a word: ");
        scanf("%s", &word[i]);
        i++;
    }
    while (word[i][0]!='.');

    number_of_word =i;
    printf ("You entered %d word(s):\n", number_of_word);
    for (i=0; i<number_of_word; i++)
    {
        printf("%s\n", &word[i]);
    }

    return 0;
}

-------------------------------------------------- ---------------------

編集1:

OKこれを試してみましたが、うまくいきましたが、ユーザーが入力できる単語の数も各単語の文字の数もわからないため、文字列の未知のサイズの配列を宣言するための最良の方法を探しています。C++では呼び出される可能性があります動的割り当て配列、Cでそれを行う方法がわかりません

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main () 
{ 
    char word[20][50]; //array has maximum 20 words, each word maximum 50 character
    int i=0, number_of_word;

    do
    {

        printf ("Enter a word: ");
        scanf("%s", word[i]);
        i++;
    }
    while (word[i-1][0]!='.');

    number_of_word =i-1;
    printf ("You entered %d word(s):\n", number_of_word);
    for (i=0; i<number_of_word; i++)
    {
       printf("Word %d is %s\n", i, word[i]);
    }


    return 0;
}
4

8 に答える 8

5

個々の文字列を格納するためのメモリを割り当てていないため、プログラムは未定義動作を呼び出します。

これ:

char *word[50];

50個のポインターの配列を定義しますが、それ以上のストレージはありません。

そして、あなたがこれをするとき:

scanf("%s", &word[i]);

ポインタ配列に書き込んでいます。

于 2012-04-29T19:54:54.680 に答える
1
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main () {
    char *word[50]; //each word has maximum 50 word
    char enter_word[50];//maximum 49 character
    int i=0, number_of_word;

    while(1){
        printf("Enter a word: ");
        scanf("%49s", enter_word);
        if(*enter_word == '.')break;
        word[i++]=strdup(enter_word);
    }

    number_of_word = i;
    printf ("You entered %d word(s):\n", number_of_word);
    for (i=0; i<number_of_word; i++){
        printf("%s\n", word[i]);
    }

    for(i=0;i<number_of_word; ++i)
        free(word[i]);

    return 0;
}
于 2012-04-29T22:43:20.590 に答える
0
char *word[50];

50個のポインターの配列があります。50バイトのチャンクの配列が必要です。何語読みたいですか?最大値がわかっている場合は、事前にスペースを割り当てることができます。そうでない場合は、文字列のリンクリストのようなものが必要です。これを読むと、新しい項目を追加できます。

于 2012-04-29T19:57:15.673 に答える
0

そのprintf呼び出し。単語の最後に終了文字\0を追加することを忘れないでください。文字列を出力するときのPrintfは、終了文字\0を読み取るまでchar配列内のすべてを出力します

BasicAlly ... Hosは、単語の長さと印刷を停止するタイミングをprintfに知らせる必要がありますか?(現在は永久に継続します)

于 2012-04-29T19:58:31.570 に答える
0

個々の文字列にメモリを割り当てるために何もしていません。

Char * word [50]は、charポインタの1つの配列へのポインタを宣言するだけです。

編集

ここでいくつかの擬似コードを使ってこれを説明しようと思います...電話でフォーマットされたコードはほとんど不可能です:)以前のchar*input [50]を考えると:

char * nextString;

bool entering=true;

do{

nextString =calloc(50);

// enter the string to nextString

if (nextString[0] != '.'){

     input[i] = nextString;

     i++;

 } else{

 entering=false;

}
}
}while(entering)
于 2012-04-29T20:00:42.273 に答える
0

あなたが宣言するとき

char *word[50];

ランダムメモリを指す50文字のポインタがあります。あなたが欲しいものはこのようなものです:

char word[50][50];

49語(および「。」)のみを使用でき、それぞれの文字数は50文字未満であることに注意してください(\ 0を忘れないでください。したがって、50文字の単語はオーバーフローします)。

そして、scanf呼び出しを次のようなものに変更する必要があります。

scanf("%s", word[i]);

word [i]はすでにポインタであるため、&は必要ないことに注意してください。

于 2012-04-29T19:57:01.627 に答える
0

「char*word [50]」は、個々の文字列にメモリを割り当てるために何もしていません。allocの機能を使用して割り当てる必要があります

于 2012-04-30T11:35:47.977 に答える
0

scanf()で「%s」の代わりに「%[^\n]」を使用しようとします。

「%s」は、文字列の最初のスペースが見つかるまで文字を格納するためです。

最初に尋ねたプログラムでこれを試してください

よろしくお願いします。

于 2012-04-30T11:52:21.553 に答える