我試圖使用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;
}
步驟通過與調試你的代碼。或者編一個小例子,證明'isalpha'壞了(提示:不是)。當初學者嘗試通過編寫巨大的複雜算法進行編程,然後將他們的整個代碼發佈到Stack Overflow並說「不起作用」時,它會讓人們瘋狂。學會將問題分解成易於解決的問題,並且/或者學習使用調試器。 – 2015-03-02 04:40:37
我知道isalpha沒有被破壞,因爲我用一個例子測試了它:char ch ='a'; if(isalpha(ch)){printf(「it's a character」);} – 2015-03-02 04:41:34
考慮安裝'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