1

これは私のコード例です:

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

void convert(char *a, char *b) {
    int i;
    for(i=0; i<strlen(a); i++) {
        b[i]=tolower(a[i]);
    }
}

int main() {
    char a[20], b[20];

    fgets(a, sizeof(a), stdin);
    convert(a, b);
    printf("%s\n", b);
    return 0;
}

ただし、convert() 関数は、strlen(a) よりも 1 文字多く変換することもあります (ランダムな文字です)。たとえば、次の出力があります。

ASDSA
asdsa
%

どうすれば修正できますか?

4

3 に答える 3

5

'\0'の最後にヌル文字()を追加する必要がありbます。

于 2012-09-09T08:25:19.443 に答える
2

他の人が述べたように、ターゲット文字列をnullで終了する必要があります。それとは別にa、ループの各反復での長さを再計算していることに注意してください。これは小さな文字列では問題になりませんが、大きな文字列では、変換にかかる時間が文字列の長さの2乗に比例することに気付くでしょう。標準的なイディオムは、長さを1回計算し、それを繰り返し使用することです。これらの2つの変更により、関数は次のようになります。

void convert(const char *a, char *b) {
    size_t i, len = strlen(a);
    for(i = 0; i < len; i++) {
        b[i] = tolower((unsigned char) a[i]);
    }
    b[len] = '\0';
}
于 2012-09-09T09:22:24.120 に答える
1

strlen は文字列の長さを返します。たとえば、strlen("hello") は 5 です。これは、文字列を終了するために使用される 0 文字をコピーしません (つまり、メモリ内の文字列は実際には 6 文字の長さです: 'h' 'e ''l''l''o''0')

于 2012-09-09T08:35:13.037 に答える