-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];
}
}
}
Прочитайте документацию для strtok, это не волшебно «превратить его в лексемы». И ваш пример длиной 10 символов, который не вписывается в 'char [10]', вы забыли нулевой терминатор. – Mat
относительно этой строки: fgets (строка, sizeof (строка), stdin); код должен проверить возвращаемое значение из функции fgets(), чтобы гарантировать, что байты sizeof (string) считываются в строку. (BTW: string - это имя класса в C++, поэтому, вероятно, его не следует использовать). – user3629249
Одна из проблем заключается в том, что 'ad bc daa' использует 10 символов, поэтому вы не сделали так, чтобы ваши массивы были достаточно большими, чтобы хранить данные и завершение null. Вы используете 'fgets()', что хорошо, но это означает, что ваши данные будут усечены после 9 символов. –