2015-03-02 188 views
0

我試圖使用for循環通過兩個字符串逐個字符並查看它們在哪裏是平等的,他們在哪裏是不同的,如果是這樣,如果都是字母比我做一個條件,但如果一封信是一封信,一封是下劃線,那麼我還會做其他事情。循環的第一部分工作正常;它可以分辨兩個值是否相等。但是,當我使用isalpha來查看它們是不是兩個不同的字母時,它不會這樣做。isalpha()不能正常工作

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
char s1[] = "v_intner_"; 
char s2[] = "wri_t_ers"; 


char* getTranscript(char* s1, char* s2){ 
    int i; 
    char sOneTemp[9]; 
    char sTwoTemp[9]; 
    char eTranscript[9]; 
    strcpy(sOneTemp, s1); 
    strcpy(sTwoTemp, s2); 

    for(i=0; i<9; i++){ 
     if(sOneTemp[i]==sTwoTemp[i]){ 
      printf("Those two characters are equal.\n"); 
     } 
     if(sOneTemp[i]!=sTwoTemp[i]){ 


      if(isalpha(sOneTemp[i]) && isalpha(sTwoTemp[i])){ 
       printf("Both are letters\n"); 
      } 
      else{ 
       printf("One is a dash\n"); 
      } 
     } 
    } 
printf("The value of s1 is: %s\n", sOneTemp); 

return s1;} 
main() 
{ 
printf("The main method returns: %s", getTranscript(s1,s2)); 
return 0; 
} 
+3

步驟通過與調試你的代碼。或者編一個小例子,證明'isalpha'壞了(提示:不是)。當初學者嘗試通過編寫巨大的複雜算法進行編程,然後將他們的整個代碼發佈到Stack Overflow並說「不起作用」時,它會讓人們瘋狂。學會將問題分解成易於解決的問題,並且/或者學習使用調試器。 – 2015-03-02 04:40:37

+0

我知道isalpha沒有被破壞,因爲我用一個例子測試了它:char ch ='a'; if(isalpha(ch)){printf(「it's a character」);} – 2015-03-02 04:41:34

+0

考慮安裝'libasan'並用'-g -fsanitize = address'進行編譯。這需要至少gcc 4.8。它有助於找到緩衝區溢出。輸出爲您的程序:== == 1842 ==錯誤:AddressSanitizer:地址[...]上的堆棧緩衝區溢出 在線程T0處寫入大小爲10的文件t0 #0在strcpy (/lib64/libasan.so.1+0x30203) 地址0x7fffdbbf48d9位於線程T0的棧中,位於幀 #0 0x400a75中的偏移量41中getTranscript(/home/osboxes/a.out+0x400a75 ) 此框架有2個對象: [32,41)'sOneTemp'<==在偏移41處的內存訪問溢出了這個變量[012] – 4566976 2015-03-03 16:39:57

回答

2

您的isalpha邏輯是正確的。但是你有一個緩衝區溢出:

char sOneTemp[9]; 
char sTwoTemp[9]; 

但你用strcpy 10個字符的複製(記住,C字符串有一個空終止)。如果你修復這個錯誤,那麼代碼會給出預期的輸出。

一個很好的解決辦法就是在函數中使用s1s2而不是冗餘複製輸入字符串。

+0

注:我希望你不打算返回'eTranscript' – 2015-03-02 04:44:33

+0

是的,我打算退回eTranscript?爲什麼? – 2015-03-02 04:49:32

+0

@TomRodgers它是函數的局部變量,所以當函數返回時它將被銷燬。 [見這裏](http://stackoverflow.com/questions/25798977/returning-string-from-c-function)的一些想法。 – 2015-03-02 04:52:22

0
char sOneTemp[9]; 
char sTwoTemp[9]; 
char eTranscript[9]; 
strcpy(sOneTemp, s1); 
strcpy(sTwoTemp, s2); 

您的數組大小不足以容納10個字符,包括nul字符。因此,請增加陣列大小以包含nul字符

+0

謝謝!我誤解了我的琴絃。 – 2015-03-02 04:49:49

2

您的程序受未定義的行爲影響。要使用strcpy字符串"v_intner_",目標需要至少10個字符。你已經創建了只有9個字符的數組。

更改線路:

char sOneTemp[9]; 
char sTwoTemp[9]; 

char sOneTemp[N]; // Where N is 10 or greater. 
char sTwoTemp[N]; 
+0

謝謝。我誤解了我的琴絃。 Jeez,我浪費了一個小時試圖弄清楚。大聲笑!希望我可以讓你高興,但我沒有足夠的聲望。希望別人會。 – 2015-03-02 04:48:37