2016-03-09 58 views
-3

代碼之間的一些差異所以我做了一些代碼:在記事本和碼VS

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 
#define SMALLSTRLEN 3 
#define BIGSTRLEN 4 
#define SMALLASCIIA 97 
#define BIGASCIIA 65 
#define BIGASCIIZ 90 
#define SMALLASCIIZ 122 
int main(void) 
{ 

    int i = 0,j=0,q=0; 
    char str[] = "SHaddOW"; 
    char smallStr[SMALLSTRLEN]; 
    char bigStr[BIGSTRLEN]; 
    printf("%s", str); 
    for (i = 0; str[i]; i++) 
    { 
     if ((str[i] >= SMALLASCIIA) && (str[i] <= SMALLASCIIZ)) 
     { 
      smallStr[j] = str[i]; 
      j++; 
     } 
     else if ((str[i] >= BIGASCIIA) && (str[i] <= BIGASCIIZ)) 
     { 
      bigStr[q] = str[i]; 
      q++; 
     } 
    } 
    bigStr[q] = "\0"; 
    puts(smallStr); 
    puts(bigStr); 
    printf("\n\n\n%s", bigStr); 
    //getchar(); 
    system("PAUSE"); 
    return 0; 
} 

bigStr需要有所有的大寫字母,並從該smallStr所有的小寫字母原件str。使用gcc編譯器的記事本++中的輸出是:bigStr= SHOWadd , smallStr = add

有人可以告訴我是什麼問題?

+1

編譯器應該給你一個警告,解釋問題的一部分。如果你不修復編譯器警告,那麼你不應該期望你的代碼工作。其他問題:'BIGSTRLEN'和'SMALLSTRLEN'不夠大,'smallStr'需要NUL終結符。 – user3386109

+2

爲什麼'#define BIGASCIIA 65'? A並不總是65.使用「A」代替,更正確,更易於閱讀 –

回答

1

此代碼具有緩衝區溢出和未終止的字符串。這就是你使用兩個編譯器得到不同結果的原因:你正在調用未定義的行爲。

您的測試字符串有七個字符,三個小寫字母和四個大寫字母。

您正在將這些字符追加到smallStrbigStr數組中,但這些數組只能爲您要追加的實際字符留出空間,而不允許使用空終止符。

當您設置bigStr[q] = "\0";時,您已經填充了四個字符的bigStr數組。在數組結束後,空終止符被寫入未定義的位置。

smallStr數組根本沒有收到空終止符。如果確實如此,它也將以與bigStr相同的方式超過數組的末尾。

smallStrbigStr的長度是硬編碼的。如果使用不同的測試字符串會發生什麼?

你寫這段代碼的目的是什麼?也許你應該考慮使用std::string用C++編寫它來避免這些問題。

如果你確實想用C語言編寫而沒有字符串庫,考慮在源字符串上做兩遍。第一遍只會計數小寫字母和大寫字母的數量。然後,您可以分配兩個正確大小的數組(不要忘記空終止符)。然後第二遍可以填充兩個數組,並向每個數組附加空終止符。