2012-07-11 51 views
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)什么也不打印。

请指教。

+0

尝试单步执行调试器中的代码 - 您不仅可以找到并修复您的错误,但是您将在此过程中学到很多知识。 – 2012-07-11 07:48:28

+4

字符串的NUL终止符位于前面。这就是原因。 – nhahtdh 2012-07-11 07:49:07

+0

@Paul我在Vim中编写了这个应用程序,而不是带有调试器的IDE。我希望它能在没有调试的情况下工作。但感谢您的建议,我会尝试在IDE中打开我的应用程序并对其进行调试。 – dhblah 2012-07-11 07:53:00

回答

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 
+1

strlen位于string.h所以不要忘记#include 2012-07-11 07:54:34

+0

@Zekian:谢谢 - 好点 - 我现在已经更新了答案来涵盖这一点。 – 2012-07-11 07:55:04

3

的问题是,将传递给insertion_sort长度包括终止\0字符,它碰巧有值0,所以在排序它被放置为您的数组的第一个元素。这就是为什么你最后的puts()什么都不打印 - 因为第一个字符现在是“字符串的结尾”。

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