1

私は次のコードを持っています:

#include <stdio.h>

void insertion_sort(char[], int);
void swap(char*, char*);

int main() {
    char s[] = "hello world";
    puts(s);
    insertion_sort(s, sizeof(s)/sizeof(char));
    puts("done\n");
    puts(s);
    return 0;
}

void swap(char* a, char* b) {
    char tmp = *a;
    *a = *b;
    *b = tmp; 
}

void insertion_sort(char s[], int n)
{
    int i,j;
    /* counters */
    for (i=1; i<n; i++) {
        j=i;
        while ((j>0) && (s[j] < s[j-1])) {
            swap(&s[j],&s[j-1]);
            j = j-1;
        }
        printf("%s\n", s);
    }
}

問題は、insertion_sort()関数呼び出しの後、s空になることです-puts(s)何も出力しません。

お知らせ下さい。

4

2 に答える 2

8

変化する:

insertion_sort(s, sizeof(s)/sizeof(char));

に:

insertion_sort(s, strlen(s));

それ以外の場合は、の'\0'ターミネータをs[]自分の種類に含めることになります。

そのため、追加のヘッダーが必要になることに注意してくださいstrlen

#include <stdio.h>

に:

#include <stdio.h>    // printf etc
#include <string.h>   // strlen etc
于 2012-07-11T07:49:49.027 に答える
3

問題は、渡す長さinsertion_sortに終了\0文字が含まれていることです。これには値が含ま0れているため、並べ替えると、配列の最初の要素として配置されます。これが、最後puts()に何も出力されない理由です。最初の文字が「文字列の終わり」になっているためです。

文字列のサイズを計算することをお勧めします。これを使用strlen()すると、終了文字を除いた文字列の長さが返されます。または、自分のやり方でやりたい場合は、終了文字を考慮して、全長から差し引きます。

于 2012-07-11T07:52:23.393 に答える