函数使数组为空

时间:2012-07-11 07:46:43

标签: c

我有以下代码:

#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)不打印任何内容。

请告知。

2 个答案:

答案 0 :(得分:8)

变化:

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

为:

insertion_sort(s, strlen(s));

否则您将包括'\0' s[]的{​​{1}}终结符。

请注意,您需要strlen的其他标题,以便进行更改:

#include <stdio.h>

为:

#include <stdio.h>    // printf etc
#include <string.h>   // strlen etc

答案 1 :(得分:3)

问题是,您传递给insertion_sort的长度包括终止\0字符,该字符恰好具有值0,所以在排序中它被放置为您的第一个元素阵列。这就是为什么你的最后一个puts()没有打印 - 因为第一个字符现在是“字符串的结尾”。

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