1
int main() {
    char str1[21];
    char str2[21];
    char l_str1[21];
    char l_str2[21];

    printf("Please enter the first word: ");
    scanf("%s", str1);
    printf("Please enter the second word: ");
    scanf("%s", str2);

    Lowercase_Strings(str1, l_str1);
    Lowercase_Strings(str2, l_str2);

    printf("Lowercase string 1: %s", l_str1);
    printf("Lowercase string 2: %s", l_str2);

// Converts original strings to lower case, keeping original string unchanged
void Lowercase_Strings(char str[21], char l_str[21]) {
    char c;
    int i;

    for(i = 0; i < strlen(str); ++i) {
        c = str[i];
        l_str[i] = tolower(c);
    }
}

やあみんな/女の子!ここでは新しいので、これをフォーマットする方法に問題がある場合は、批判を気にしません.

これは、2 つの文字列が互いのアナグラムであるかどうかをチェックする私のプログラムのスニペットです。大文字と小文字は区別されません。

ただし、配列は、呼び出しの順序やいずれかの配列に割り当てられた文字列に関係なくl_str1、配列と比較して常に何らかの方法で「破損」してしまいます。l_str2Lowercase_Strings

たとえば、str1 = "MARY"andstr2 = "ARMY"はになりますが、最後に 2 つのランダムな記号l_str2 = "army"が付きます。l_str1 = "mary"

何が起こっているのか誰かが知っているなら、それはありがたいです。

4

3 に答える 3

4

変換された文字列に NULL CHAR を追加していません。

for ループの最後に以下の行を追加します

l_str[i] = 0x00;

編集:

1.どちらの配列も値に初期化されていません。

2.printf配列にnullが見つかるまで出力します。

したがって、ここでは、正しい位置で配列の 1 つと 2 番目の配列の 2 つの位置で null を取得できて幸運であるとしか言えません。コードで行ったことは未定義の動作であり、これによりプログラムがクラッシュする可能性があります。

于 2015-02-12T09:35:39.800 に答える
1

strlen()終端の null にはカウントされません。したがって、Lowercase_Strings()関数では、ループの[外側]の後に、for追加する必要があります

l_str[i] = `\0`;

l_strnull で終了することを確認します。

また、次を使用して入力サイズを制限することもできます

 scanf("%20s", str1);       //read only 20 chars, 1 for null, total 21
 scanf("%20s", str2);       //read only 20 chars, 1 for null, total 21
于 2015-02-12T09:37:21.997 に答える