2016-12-15 3 views
1

일부 코드에서 작업 중입니다. 문자열을 입력으로 가져 와서 되돌립니다.트랩 중단 : MacOS에서 strcpy를 사용할 때 C에서 6 초

문자열을 입력하면 "abort trap : 6"오류가 발생합니다. 문제는 내 사용 (오용?) strcpy의 생각하지만, GDB 도움이되지 않습니다 및 그래서이 오류 및 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]);line[I]\0이 아닌 경우 "버퍼 오버 플로우"입니다 (temp은 실제로 버퍼가 아닙니다). 단일 문자를 복사하려면 다음 문자를 복사하십시오.

temp = line[I]; 

이는 다음 두 문장에도 적용됩니다.

+0

아, 그래. 도와 주셔서 감사합니다! – Luciano

3

strcpy는 문자 만 복사하지 않습니다. 문자열을 복사합니다. 문자열은 \ 0 종료 문자 다음에 오는 문자 수입니다. strcpy를 위

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

문자가 끝날 때까지 & 온도에 의해 지정된 주소 (첫 번째 \ 0에 도달) 번째 I에서 시작하는 문자열을 복사하려고합니다. 임시 변수가 단일 char 변수이기 때문에 실수로 스택 프레임을 중개하고 실수로 다른 변수에 내용을 쓰는 것입니다.

당신은 내가 당신이 종료 제로를 제외하고 문자열의 문자 쌍을 교환 할 필요가 문자열을 역으로 문자

temp = line[I]; 
0

을 토륨 얻기 위해이 같은 것을 사용해야합니다.

표준 C 함수 strcpy은 문자열을 복사하도록 설계되었습니다. 예를 들어 만약 변수 line 문자열 "abcd" 포함 가변 I

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

이 문

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

동등 다음이 문장 제로인 있으며 할당 된 메모리에 전체 문자열을 복사하려고 이 선언

char temp; 

에서 알 수 있듯이 하나의 바이트의 메모리 출력을 결과로서 변수 temp을 덮어 쓰면 결과적으로 프로그램의 정의되지 않은 동작이 발생합니다.

따라서 함수를 사용하는 대신 별도의 문자를 할당해야합니다.

루프는 메모리가 충분한 경우 기능 fgets가 문자 배열에 제로를 종료 추가 것을

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(line,sizeof(line),stdin); 
line[ strcspn(line, "\n") ] = '\0'; 
size_t size = strlen(line); 

또한 표준 함수 strlensize_t를 반환 갖는다. 따라서 유형 int 대신 size 변수에이 유형을 사용하는 것이 좋습니다.