2016-12-15 5 views
1

Я работаю над некоторым кодом, беря строку в качестве ввода и возвращает ее в обратном порядке.Abort trap: 6 in C при использовании strcpy на MacOS

Когда я ввожу строку, я получаю ошибку «прерывание ловушки: 6». Я думаю, что проблема в моем использовании (неправильное использование?) Strcpy, но GDB не помогает, и другие вопросы о SO об этой ошибке и strcpy не помогли мне понять, почему я получаю эту ошибку.

Я добавил несколько комментариев в свой код, объясняющий предполагаемую функциональность.

Благодарим за помощь или материал для чтения, который вы можете предоставить!

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

     int main() 
     { 
      char line[1024]; 
      fgets(line,sizeof(line),stdin); 
      int size = strlen(line); 
      for(int I = 0; I <size-I;I++) 
      { 
       char temp; 
       int relative_size = size-I; 
       strcpy(&temp,&line[I]);//??copies Ith character of line to temp?? 
       strcpy(&line[I],&line[relative_size]); //??swaps characters at [I] and [size-I]?? 
       strcpy(&line[relative_size],&temp); 
      } 
      printf("%s", line); 
      return 0; 
     } 
+0

'int relative_size = size-I;' -> 'int relative_size = size-I-1;', 'strcpy (& temp, & line [I]);' -> 'temp = line [I]; 'и так далее. – BLUEPIXY

+0

@BLUEPIXY, который отлично работает! Спасибо большое. – Luciano

ответ

2

strcpy() не копирует ни одного символа, но в целом 0-завершённая строка. Поэтому strcpy(&temp, &line[i]); является «переполнением буфера» (temp на самом деле не является буфером), если line[I] не \0. Чтобы скопировать один символ, просто назначьте его:

temp = line[I]; 

Это относится и к следующим двум утверждениям.

+0

А, ок. Спасибо вам за помощь! – Luciano

3

strcpy не копирует только символы. он копирует строки. Строка - это количество символов, за которыми следует символ окончания \ 0.

strcpy(&temp,&line[I]); 

Над зЬгсру пытается скопировать строку, начиная с I-го символа до конца (не доходя до первой \ 0) на адрес, указанный & темп. потому что temp - это переменная с одним символом, на самом деле вы бросаете свой стек стека и случайно записываете вещи на другие переменные.

Вы должны использовать что-то вроде этого, чтобы я й символ

temp = line[I]; 
0

Чтобы изменить строку вам нужно поменять пары символов строки без завершающего нуля.

Стандартная функция C strcpy предназначена для копирования строк. Например, если переменная line содержит строку "abcd" и переменная I равна нулю, то это заявление,

strcpy(&temp,&line[I]); 

эквивалентно этому утверждению

strcpy(&temp,&line[0]); 

и пытается скопировать всю строку в памяти, выделенной за один байт, как видно из декларации

char temp; 

В результате память o переменная temp будет перезаписана, что, в свою очередь, приведет к неопределенному поведению программы.

Таким образом, вместо использования функции вы должны назначить отдельные символы.

Петля может выглядеть следующим образом

size_t size = strlen(line); 

for (size_t i = 0; i < size - i; i++) 
{ 
    char temp = line[i]; 
    line[i] = line[size - i - 1]; 
    line[size - i - 1] = temp; 
} 

принять во внимание, что функция fgets присоединяет Нуль в массивы символов, если они имеют достаточно памяти. Вы должны удалить его из строки перед тем, как поменять его. Это можно сделать следующим образом.

fgets(line,sizeof(line),stdin); 
line[ strcspn(line, "\n") ] = '\0'; 
size_t size = strlen(line); 

Также стандартная функция strlen имеет тип size_t возврата. Поэтому лучше использовать этот тип для переменной size вместо типа int.