2014-11-09 90 views
-3

我正在研究C課程的練習,並且遇到了分段錯誤。這段代碼應該改變數組的順序。像,輸入:ad b c daa,輸出:daa c b ad。它由空間改變。所以我用strtok把它變成令牌和循環來改變順序,但是我得到了一個錯誤。我的問題是什麼是分割錯誤:11,爲什麼我會得到一個?C字符串數組順序操作

#include <stdio.h> 
#include <string.h> 

void changeorder(int SIZE, char string[], char changed_string[]); 

int main() { 
    const int SIZE = 10; 
    char string[SIZE]; 
    char changed_string[SIZE]; 

    printf("Enter string: "); 
    fgets(string, sizeof(string), stdin); 
    strtok(string, " "); 
    size_t len = strlen(string); 
    if(string[len-1] == '\n') { 
     string[len-1] = '\0'; 
    } 
    changeorder(SIZE, string, changed_string); 
} 

void changeorder(int SIZE, char string[], char changed_string[]) { 
    int i; 
    int j; 
    for(i=SIZE; i>0; i--) { 
     for(j=0; j<SIZE; j--) { 
      string[i] = changed_string[j]; 
     } 
    } 
} 
+2

閱讀文檔的strtok的,它不會神奇地「變成令牌」。你的例子是10個字符長,不適合'char [10]',你忘記了空終止符。 – Mat 2014-11-09 05:45:10

+2

關於這一行:fgets(string,sizeof(string),stdin);代碼需要檢查fgets()函數的返回值,以確保將sizeof(字符串)字節讀入字符串。 (順便說一下,字符串是C++中類的名稱,因此可能不應該使用) – user3629249 2014-11-09 05:58:09

+4

一個問題是'ad bc daa'使用了10個字符,所以你沒有調整足夠大的數組來保存數據和終止null。你使用'fgets()'這很好,但這意味着你的數據將在9個字符後被截斷。 – 2014-11-09 06:03:18

回答

0
#include <stdio.h> 
#include <string.h> 

void changeorder(size_t len, char string[], char changed_string[]); 

int main(void) { 
    const int SIZE = 16; 
    char string[SIZE]; 
    char changed_string[SIZE]; 

    printf("Enter string : "); 
    fgets(string, sizeof(string), stdin); 
    strtok(string, "\n"); 
    size_t len = strlen(string); 
    changeorder(len, string, changed_string); 
    printf("'%s'\n", changed_string); 
    return 0; 
} 

void changeorder(size_t len, char string[], char changed_string[]) { 
    char temp[len]; 
    int i=0, k=0; 
    while(len--){ 
     if(string[len] != ' ') 
      temp[k++] = string[len]; 
     if(string[len] == ' ' || !len){ 
      while(k) 
       changed_string[i++] = temp[--k]; 
      if(string[len] == ' ') 
       changed_string[i++] = ' '; 
     } 
    } 
    changed_string[i] = 0; 
}