2016-11-22 34 views
-1

最大50文字のユーザー入力文字列を取得する必要があります。したがって、私はMAX_STRING_LENGTH変数を50で定義し、その文字列は51文字で初期化されています。ただし、入力が48文字を超えるたびに、最後の2文字から文字列が切り捨てられます。これは学校の運動であり、私は<string.h>を使うことができません。文字列が2文字に満たない文字列

#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を使用すると常に改行(\n)が作成されていることを前提としています(50文字の完全な文字列が入力されても)常に1文字が失われているため、文字列の)。しかし、私は他のキャラクターがどのように失われたのか分かりません。

フィードバックに感謝いたします。あなたは高々MAX_STRING_LENGTH - 1文字が配列stringInputに読まれることを指定し、この呼び出しで

+2

「fgets」のドキュメントをよくお読みください。それは常にヌルターミネータを格納するので、渡すサイズよりも1文字少ないものを読み込むので、50文字を読み取ることはできません(49文字しか読み込まれず、ヌルを格納するため)。あなたは、もし存在するならば、改行を削除すると主張しますが、最後の文字が改行でない場合でも常にそれを無条件に削除します。なぜあなたは 'strlen'を手で再実装しましたか? –

+0

49文字を入力すると、47が得られますか?または46? – KyleKW

+0

* 50の*文字配列*を51の値で初期化するにはどうすればよいですか? –

答えて

0

fgets(stringInput,MAX_STRING_LENGTH,stdin); 

ありがとうございます。

あなたは、配列が(終端ゼロを除く)50文字の文字列を含めることができることを望むなら、あなたが入力に対応し、改行文字

fgets(stringInput,MAX_STRING_LENGTH + 1,stdin); 

ようしかし、この場合に fgetsを呼び出す必要がありますユーザーが正確に50文字を入力した場合、キー入力は入力バッファーに残ります。それを解凍するには、少なくとも

char stringInput[MAX_STRING_LENGTH + 2]; 

のように配列を宣言し、それが52

0

に等しいMAX_STRING_LENGTHこの小さなループを宣言するために、より良い最初にだろうしかし

fgets(stringInput,MAX_STRING_LENGTH + 2,stdin); 

のような呼び出しを記述する必要があります

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

は、どのようなi含まれています。

-1

これは[C++]の質問ではありません。

のドキュメント

関連する問題