2013-04-14 58 views
-1

我想編寫一個程序來檢查哪個字符串具有更大的長度而不使用字符串函數。我試圖使用gets()作爲輸入,但我的程序不斷崩潰。請幫忙!謝謝!無法使用獲取字符串中的gets()C

這裏是我的代碼:在第二while

#include <stdio.h> 
int l1,l2; 
char *st1,*st2; 
void accept() 
{ 
    gets(st1); 
    gets(st2); 
} 
void length() 
{ 
    int i = 0; 
    while (st1[i] != '\0') 
    { 
     l1++; i++; 
    } 
    i = 0; 
    while (st2[i] != '\0') 
    { 
     l1++; i++; 
    } 

} 
int main() 
{ 
    accept(); 
    length(); 
    if (l1 > l2) 
     printf("String #1 is greater in length.\n"); 
    else 
     printf("String #2 is greater in length.\n"); 
} 
+0

st1和st2不指向任何東西。 – wildplasser

+0

此代碼是否沒有警告地編譯?它運行沒有產生錯誤? –

+3

下面是我最喜歡的所有手冊頁的報價:「**切勿使用gets()'。**」因爲不可能安全使用。 –

回答

4

你還沒有分配空間st1st2也沒有你初始化他們...所以他們既指向記憶中某個未知的地方。試試...

char st1[1024]; 
char st2[1024]; 

這就是說,實現gets具有固有的不安全,因爲它是受到緩衝區溢出攻擊;沒有什麼可以阻止某人輸入比1024更長的字符串並導致程序崩潰。

您也可以大大簡化length()函數如下...

void length() 
{ 
    for (l1 = 0; st1[l1] != '\0'; l1++); 
    for (l2 = 0; st2[l2] != '\0'; l2++); 
} 

擴展在這一點,你對什麼對gets()一個替代的問題,答案是使用類似fgets() - 爲例如...

int main(int argc, char** argv) 
{ 
    if(fgets(st1, sizeof(st1), stdin) != NULL) 
    { 
     if(fgets(st2, sizeof(st2), stdin) != NULL) 
     { 
      length(); 

      if (l1 > l2) printf("String #1 is greater in length.\n"); 
      else if (l2 > l1) printf("String #2 is greater in length.\n"); 
      else printf("Both strings are the same length.\n"); 
     } 
     else printf("could not read second string\n"); 
    } 
    else printf("could not read first string\n"); 

    return(0); 
} 

在這種情況下,fgets()將不允許用戶溢出st1st2,這將確保他們總是空結尾的字符串。

+0

感謝您的幫助! – Shail

1

使用l2

l1=0; 
    while (st1[l1] != '\0') 
    { 
     l1++; 
    } 
    l2 = 0; 
    while (st2[l2] != '\0') 
    { 
     l2++; 
    }