我有以下代码:
#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)
不打印任何内容。
请告知。
答案 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()
来计算字符串的大小,这将返回不包括终止字符的字符串的长度。或者,如果您想按照自己的方式进行操作,请考虑终止字符并将其从总长度中减去。