2011-12-14 105 views
3

我在char陣列中讀取scanf並且想要檢查長度是否大於15. 它僅在有時才起作用。 (如果我沒有得到一個錯誤 - >核心轉儲。)C Char陣列Userinput檢查長度

我的代碼:

#include <stdio.h> 

int checkArray(char string[], int length) { 
    int i; 
    for(i=0; string[i] != '\0'; i++); 
    if(i > length) { 
     return -1; 
    } 
    return 0; 
} 

int main() 
{ 
    const int length = 15; 
    char x[15]; 
    scanf("%s", x); 
    if(checkArray(x, length) == -1) { 
     printf("max. 15 chars!"); 
     return 1; 
    } 
    return 0; 
} 

回答

1

scanf讀取的字符串超過14個字符(保留一個用於null終止)時間越長,它的破壞內存。然後,有幾個問題,您checkArray()方法:

int checkArray(char string[], int length) { 
    int i; 

    // This next line could as well be a call to `strlen`. 
    // But you shouldn't let it access `string` when `i` is >= `length`. 
    for(i=0; string[i] != '\0'; i++); 

    // This should be `>=`. If `i` is 15, you accessed (in the loop above) 
    // `string[15]`, which is past the end of the array. 
    if(i > length) { 
     return -1; 
    } 

    return 0; 
} 
5

x可以因爲你的尺寸爲15的緩衝區有它從來沒有(法律上)要超過14個字符的大(14個字符的空格,一個用於NUL終結符),因此嘗試檢查它是否少於15個字符長是沒有意義的。

如果試圖存儲一個大於14的字符串,它將溢出數組,並希望會導致類似您遇到的錯誤。可選使你的陣列更大,所以它實際上可以容納超過15個字符,並把寬度說明符%s

char x[30]; 

scanf("%29s", x); // read a maximum of 29 chars (replace 29 if needed 
        // with one less than the size of your array) 

checkArray(x, 15); 
+0

你可能爲字符串做'x'17:15,一個用於溢出,另一個用於'\ 0 '。 – Kevin

0

這是一個典型的緩衝區溢出。你需要限制在讀取數據的長度:

scanf("%14s", x); 

或者,你可以告訴scanf函數分配緩衝區爲您提供:

char* x; 
scanf("%as", &x); 
... 
checkArray(x, 15); 

這將分配緩衝區足夠長的任意字符串你給它。 (當然限制物理內存和壞人發送你的應用10GB數據)。

此字符串是動態分配的,因此需要被釋放:

free(x); 
+0

他想知道用戶是否輸入了超過15個字符。 – Alin

+0

downvote的原因是什麼? –

+0

它是在您編輯它並添加動態分配部分之前。 – Alin

0

,而不是返回-1 0返回別的東西,如長度,而不是-1和我,而不是0和變化條件相應的主要功能。 然後程序每次都會給出輸出(不知道邏輯但它適用於我)