2012-07-11 50 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()來計算一個字符串的大小,它將返回一個不包含終止字符的字符串的長度。或者,如果您想按照自己的方式來做,請考慮終止字符並從總長中減去。