【解決方法】C プログラミングを使用して文の単語を 2 次元配列に格納する方法。


「仕立て屋は友人の船長との航海を経験してから船乗りになった」。 上記の文で、次のような 2 次元配列に単語を格納する方法
配列 = {“a”、”仕立て屋”、”ある”、”なる”、”a”、”船乗り”、”その後”、”彼”、”ある”、”経験した”、”a”、”航海” 、「一緒に」、「彼の」、「キャプテン」、「友達」}

私のコードは次のとおりです:

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

int main()
{
    char line[1000];
    scanf("%[^\n]", line);
    int l=strlen(line),i,count=0;
    for(i=0;i<l;i++){
        if(line[i]==' '){
            count+=1;
        }
    }
    
    char arr_word[count+1][26];
    int j,ind=0;
    for(i=0;i<count+1;i++){
        for(j=0;j<26;j++){
            if(line[ind]==' '){
                ind++;
                break;
            }
            arr_word[i][j]=line[ind];
            ind++;
        }
    }
    return 0;
}

私が試したこと:

上記のコードを試してみましたが、各単語の末尾にガベージ値が格納されます。 私を助けてください。

解決策 1

ガベージが表示される理由は、文字列の終端の null 文字を保存していないためです。 NULL 文字を考慮して、文字列の長さよりも 1 文字多い文字を格納する必要があります。

なぜリテラル値 26 を使用するのですか? これはマクロ定義、または C++ の定数値でなければなりません。 リテラル値は、特に複数の場所で使用される場合には避けるべきです。

解決策 4

You need to initialize the arr_word array with a null terminator first because an uninitialized array has the potential to store garbage values.

And also, you need to added an additional condition to break the loop when it encounters a null terminator in the sentence ("line" array). This prevents the loop from storing a non-existing character, which could result in the output of a garbage value.
C
#include <stdio.h>
#include <string.h>

int main()
{
    char line[1000];
    scanf("%[^\n]%*c", line);
    int l=strlen(line),i,count=0;
    for(i=0;i<l;i++){
        if(line[i]==' '){
            count+=1;
        }
    }
    
   
    
    char arr_word[count+1][26];
    int j,ind=0;
    
/* intialize arr_word array */
    
     for(i=0; i <count+1; i++){
        for(j = 0; j <26; j++){
        arr_word[i][j] = '\0';
        }
    }
    for(i=0;i<count+1;i++){
        for(j=0;j<26;j++){
            if(line[ind]==' ' || line[ind]=='\0'){
                ind++;
                break;
            }
            arr_word[i][j]=line[ind];
            ind++;
        }
    }
    
    for(i=0; i <count+1; i++){
        for(j = 0; j <26; j++){
            printf("%c", arr_word[i][j]);
        }
        
        printf("\n");
    }
    return 0;
}

コメント

タイトルとURLをコピーしました