0

プログラミングの初心者 (学校) で、これが何/なぜ起こっているのか少し混乱しています。

要素の配列を反復処理するループがあります。要素ごとに配列の整数を取得し、関数 getelementsymbol を使用してそれを char に変換し、strcat を使用して一時配列に追加します。私が抱えている問題は、一時配列の要素に先行する要素の残りが含まれていることです。これは私のコードのスニペットです。私が受け取る出力はこれです:

単語1

単語1単語2

単語1単語2単語3

char* elementsBuildWord(const int symbols[], int nbSymbols){
/*  ROLE            takes a list of elements' atomic numbers and allocate a new string made
                    of the symbols of each of these elements
PARAMETERS      symbols     an array of nbSymbols int which each represent the atomic number
                                of an element
                    nbSymbols   symbols array's size
RETURN VALUE    NULL    if the array is of size <= 0
                            or if one of the symbols is not found by our getElementSymbol function
                    other   the address of a newly allocated string representing the    concatenation
                            of the names of all symbols
 */
    char s1[MAX_GENERATED_WORD_LENGTH];
    int y;
    char *s2;
    size_t i;

    for (i = 0; i < nbSymbols; i++){
        y = symbols[i];
        s2 = getElementSymbol(y);
        strcat(s1, s2);         
    }
    printf("%s ", s1);
}
4

2 に答える 2

1

まず、あなたs1は初期化されていません。strcat関数は、新しい文字列を既存の文字列に追加します。これは、最初から文字列s1でなければならないことを意味します。初期化されていない char 配列は文字列ではありません。as として宣言することをお勧めします。s1

char s1[MAX_GENERATED_WORD_LENGTH] = { 0 };

または少なくともそうする

s1[0] = '\0';

あなたのサイクルを開始する前に。

次に、関数はポインターgetElementSymbolを返します。char *そのポインターはどこを指していますか? それが指すメモリは誰が管理しますか? これはあなたのコードからは明らかではありません。関数が無効なポインター (ローカル バッファーへのポインターなど) を返す可能性があるため、さまざまな異常が発生する可能性があります。それがどのように実装されているかを見ずに言う方法はありません。

于 2013-11-08T00:28:00.923 に答える
0

strcat文字列に追加することになっています。strcpy既存の文字列を上書きする場合に使用します。s1[0] = '\0';本当に必要な場合はbeforeを使用strcatして文字列を「空白」にすることもできますが、本当に必要なように見えますstrcpy

上記のスニペットからは、なぜ必要なのかさえ明確ではありませんs1-単に印刷することができますs2...

于 2013-11-08T00:27:57.483 に答える