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字符,它恰好具有 value 0,因此在排序中它被放置为数组的第一个元素。这就是为什么您的最后puts()一个字符什么都不打印的原因 - 因为第一个字符现在是“字符串的结尾”。

我建议您计算字符串的大小,使用strlen()它将返回字符串的长度,不包括终止字符。或者,如果您想按照自己的方式进行操作,请考虑终止字符并将其从总长度中减去。

于 2012-07-11T07:52:23.393 回答