2014-11-09 92 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; 
}