私はC言語で新しいです。私は文字列の動的配列で遊びます。私は、テキストファイルからすべての単語を文字列の配列にロードしたい。私は動的に項目を配列に追加します。それはほとんど動作しますが、私がそれらをプリントアウトしたいときには、私は単語を繰り返しました。私は問題があると思うdictionary = (char **)realloc(dictionary, sizeof(char *) * (idx));
配列は元のデータをコピーして1つ増やす必要があります。ポインタを使ったCの文字列の動的配列
int main() {
FILE *fr;
int i = 0;
int c;
const char *path = "..../sample.txt";
char *word;
char **dictionary;
word = (char *)malloc(sizeof(char));
dictionary = (char **)malloc(sizeof(char *));
int idx = 0; // index of word
int widx = 0; // index of char in word
fr = fopen(path, "r");
while((c = getc(fr)) != EOF){
if(c == ' '){
widx++;
word = (char *)realloc(word, sizeof(char) * (widx));
*(word + widx-1) = '\0';
idx++;
dictionary = (char **)realloc(dictionary, sizeof(char *) * (idx));
*(dictionary+idx-1) = word;
widx = 0;
word = (char *)realloc(word, 0);
}
else if(c == '.' || c == ',' || c == '?' || c == '!'){
// skip
}
else{
widx++;
word = (char *)realloc(word, sizeof(char) * (widx));
*(word + widx-1) = (char)c;
}
}
fclose(fr);
// print words
int n = idx;
for(i = 0; i < n; i++){
printf("%d - %s \n", i, *(dictionary+i));
}
return 0;
}
出力:期待
0 - shellbly
1 -
2 - shellbly
3 - Bourne-derived
4 - shellbly
5 - Bourne-derived
6 - shellbly
7 - Bourne-derived
は:
1 - The
2 - original
3 - Bourne
4 - shell
5 - distributed
6 - with
7 - V7
8 - Unix
私が何か間違ったことをしなければなりません。ご意見ありがとうございます。
ターゲット言語がCの場合は、C++タグを追加しないでください。 CとC++は2つの非常に異なる言語です。 –
'const char * path =" ..../sample.txt "; - それは何をすべきでしょうか? –
* 1 *非常に明白な問題: 'widx ++'に続いて 'realloc(word、sizeof(char)*(widx))'の後に '*(word + widx-1)= '\ 0' '。あなたが最後の操作を行うとき、 'widx - 1'の値は何ですか? –