2016-11-22 30 views
-1

我需要獲取最大長度爲50個字符的用戶輸入字符串。因此我在50處定義了一個MAX_STRING_LENGTH變量,並且該字符串使用51個字符初始化。但是,每次輸入大於48個字符時,都會從最後兩個字符中剪切字符串。這是一項學校練習,我不能使用<string.h>正在切斷兩個字符的字符串

#include <stdio.h> 
#define MAX_STRING_LENGTH 50 

int main(void) 
{ 
    int j=0; 

    char stringInput[MAX_STRING_LENGTH+1]; //string initialized. 
    printf("Please enter a valid string\n"); 
    fgets(stringInput,MAX_STRING_LENGTH,stdin); //string input. 

    for(j=0;stringInput[j]!='\0';j++); 
    if(j<MAX_STRING_LENGTH+1) 
    { 
     j=j-1; 
     stringInput[j]='\0'; //remove newline if it exists 
    } 
    //... 
    return 0; 
} 

我不明白爲什麼字符串丟失2個字符。

我假設總是在使用fgets時(即使輸入了一個完整的50個字符的字符串)創建一個換行符(\n),並且總是丟失1個字符(因此我必須增加字符串大小的字符串)。但是我不明白對方角色是如何丟失的。

我將不勝感激您的反饋。謝謝

+2

請仔細閱讀fgets的文檔。它總是存儲一個空終止符,所以它讀取的字符數小於傳遞它的大小,所以你永遠不能讀取50個字符(因爲它只能讀取49個字符,然後存儲一個空字符)。你聲稱刪除了一個換行符「如果它存在」,但是總是無條件地刪除它,即使最後一個字符不是新行 - 停止這樣做。你爲什麼手工重新實施'strlen'? –

+0

所以如果你輸入49個字符,你會得到47嗎?或46? – KyleKW

+0

如何用51個值(每個問題的第二個句子)初始化50個*字符數組*? –

回答

0

在這個調用

fgets(stringInput,MAX_STRING_LENGTH,stdin); 

您指定最多MAX_STRING_LENGTH - 1字符將數組stringInput中讀取。

如果你想該陣列可以包含50個字符(不包括終止零)的字符串,那麼你必須調用fgets

fgets(stringInput,MAX_STRING_LENGTH + 1,stdin); 

但在這種情況下,對應於輸入的新行字符如果用戶輸入完整的50個字符,Enter鍵仍將位於輸入緩衝區中。要提取它,你應該聲明數組至少像

char stringInput[MAX_STRING_LENGTH + 2]; 

和像

fgets(stringInput,MAX_STRING_LENGTH + 2,stdin); 

通話寫但它會更好,最初申報MAX_STRING_LENGTH等於52

0

這個小環

for(j=0;stringInput[j]!='\0';j++); 
    if(j<MAX_STRING_LENGTH+1) 
    { 
     j=j-1; 
     stringInput[j]='\0'; //remove newline if it exists 
    } 

刪除最後一個字符,不管我是什麼包含。

-1

這是[c]不是[C++]的問題。

的文檔