2014-11-09 2 views
-3

Я работаю над упражнением на курсе C, и я столкнулся с ошибкой сегментации. Этот код должен изменить порядок массива. Например, input: ad b c daa, output: 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

+2

относительно этой строки: fgets (строка, sizeof (строка), stdin); код должен проверить возвращаемое значение из функции fgets(), чтобы гарантировать, что байты sizeof (string) считываются в строку. (BTW: string - это имя класса в C++, поэтому, вероятно, его не следует использовать). – user3629249

+4

Одна из проблем заключается в том, что 'ad bc daa' использует 10 символов, поэтому вы не сделали так, чтобы ваши массивы были достаточно большими, чтобы хранить данные и завершение null. Вы используете 'fgets()', что хорошо, но это означает, что ваши данные будут усечены после 9 символов. –

ответ

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; 
} 
Смежные вопросы