4
int main(int argc, char** argv)
{
//Local Declaration
char last_name[20];
char first_name[20];
char phone_number[20];
char address[30];

//Statement
printf("Enter your last name: ");
fgets(last_name, 20, stdin);

printf("Enter your first name: ");
fgets(first_name, 20, stdin);

printf("Enter your phone number: ");
fgets(phone_number, 20, stdin);

printf("Enter your address: ");
fgets(address, 30, stdin);

printf("=====Address book=====\n");
printf("Name: %s%s\n", first_name, last_name);
printf("Phone Number: %s\n", phone_number);
printf("Address: %s\n", address);
return (EXIT_SUCCESS);
}

結果が期待どおりに表示されません...名前と名前が1行になっていることを意味します(例:Mark Zuckerberg)。でもこんな感じで出てきます

マーク

ザッカーバーグ

ここで何が問題になっていますか?なぜ間に新しい行があるのですか?

4

3 に答える 3

4

マニュアルページを参照してください

引用:

fgets()は、ストリームから最大で1つ小さいサイズの文字を読み込み、sが指すバッファーにそれらを格納します。EOFまたは改行の後で読み取りが停止します。改行が読み取られると、バッファに格納されます。終了ヌルバイト(aq \ 0aq)は、バッファの最後の文字の後に格納されます。

したがって、fgetsによって読み取られる文字列には、最後に改行文字が含まれます。削除する必要があります。

編集

行末を削除するには(そしてDOSを許可するには)

int end = strlen(first_name) - 1;
if (end >= 0 && '\n' == first_name[end])
{
   first_name[end--] = 0;
   if (end >= 0 && '\r' == first_name[end]) first_name[end] = 0;
}
于 2013-03-05T09:49:31.143 に答える
1

Ed が提案したように、マニュアルを参照してください。 (単純なスペース) で置き換える簡単な方法は次のとおり'\n'です。' '

first_name[strlen(first_name) - 1] = ' ';

strlenを使用string.hします。含めることを忘れないでください

于 2013-03-05T10:00:09.840 に答える
0

fgets()、 '\n' を変数 first_name に格納します。 Enter を押すと、 Mark と入力した後、 first_name に格納される文字列は "Mark\n" にprintf()なり、そのジョブを実行して改行文字を出力します。

別の良い代替手段は、使用することですfscanf()

fscanf (stdin, "%s", first_name);

編集:

エラーをチェックしfscanf()ます。

char str[50];
int bytes = -1;
fscanf (stdin, "%s%n",str,&bytes);
 if(bytes == -1)
    perror("\nIncomplete Bytes Parsed\n");
于 2013-03-05T10:05:42.443 に答える