2016-12-15 71 views
1

我正在處理一些代碼需要一個字符串作爲輸入並返回它顛倒。中止陷阱:在MacOS上使用strcpy時在C中的6中

當我輸入一個字符串,我得到一個「中止陷阱: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]);是「緩衝區溢出」(temp並非真正的緩衝區),如果line[I]不是\0。要複製單個字符,只需指定它:

temp = line[I]; 

這也適用於以下兩個語句。

+0

啊,好的。感謝您的幫助! – Luciano

3

strcpy不會單獨複製字符。它複製字符串。該字符串是字符數,後跟\ 0終止字符。

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

以上的strcpy嘗試複製從我開始個字符,直到結束(達到第一\ 0),以解決由&臨時指定的字符串。因爲臨時變量是單個字符變量,實際上你正在處理你的堆棧框架並且意外地將其寫入其他變量。

你應該使用這樣的事情讓我個字符

temp = line[I]; 
0

若要反轉需要交換對不包括終止零字符串的字符的字符串。

標準C函數strcpy旨在複製字符串。例如,如果變量line包含字符串"abcd"和可變I是等於零,那麼這種說法

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

相當於本聲明

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

,並試圖將整個字符串複製分配的內存僅用於一個字節,如從聲明中看到的那樣

char temp; 

由於結果存儲器o utside變量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