C言語で整数入力後に文字列が読み取れない原因と解決方法
問題の概要
C言語のプログラミングでは、scanf関数で整数値を入力した直後に文字列(char配列)を読み込もうとすると、文字列入力が正しく行われないという問題が発生することがあります。本記事では、この問題の原因と具体的な解決方法を詳しく解説します。
発生する原因
整数値を入力してEnterキーを押すと、その改行文字(\n)が標準入力バッファ内に残留します。続いて文字列を読み込もうとすると、バッファに残っていたこの改行文字が文字列の最初の文字として格納され、文字列入力がそこで即座に終了してしまいます。
これは、scanf関数が改行(ヌル文字として扱われる)を読み取ると、その時点で入力処理を終了するという仕様になっているためです。
解決方法
int型やfloat型の変数を読み込んだ直後に文字列や文字を入力したい場合は、入力バッファに残っている余分な改行文字を、一時的なchar型変数を使って事前に読み捨てる必要があります。
具体的には、「%d」で整数を読み込んだ後、「%c」で1文字分の改行を別の変数に読み込んでおくことで、次の文字列入力が正常に行えるようになります。
修正済みサンプルプログラム
#include <stdio.h>
struct student{
char name[10];
int roll;
char temp;
} s;
int main(){
printf("学生情報を入力してください:\n");
printf("\n出席番号を入力: ");
scanf("%d", &s.roll);
scanf("%c", &s.temp); // 改行文字を一時的に読み捨てる
printf("\n名前を入力: ");
gets(s.name);
printf("\n学生情報の表示:\n");
printf("\n出席番号: %d\t", s.roll);
printf("\n名前: %s\t", s.name);
return 0;
}
実行結果
学生情報を入力してください: 出席番号を入力: 3 名前を入力: tutorialspoint 学生情報の表示: 出席番号: 3 名前: tutorialspoint
補足:より安全な代替手段
なお、上記のコードで使用しているgets関数は、バッファオーバーフローの危険性があるため、現在では非推奨とされています。実際の開発では、fgets(s.name, sizeof(s.name), stdin) のようにfgets関数を使用することをおすすめします。fgetsであれば入力文字数を制限できるため、より安全に文字列を読み込むことができます。
-
BIOSアップデート後に「TPMを初期化できませんでした」エラーが出る場合の対処法【Windows 11/10】
Windows 11またはWindows 10のPCでBIOSをアップデートした後、システムを起動するとBIOSのスプラッシュ画面が表示された直後に「TPMを初期化できませんでした(The TPM could not be initialized)」というエラーメッセージが表示され、OSの起動もセットアップユーティリティへのアクセスもできなくなることがあります。本記事では、この問題を解決するための最適な対処法を順番にご紹介します。 この問題が発生すると、以下のような完全なエラーメッセージが表示されます。 WARNING: The TPM could not be initialized. F1
-
WhatsAppの通知が届かない原因と解決策7選|Androidで通知問題を直す方法
WhatsAppの通知が届かなくなって困っていませんか?通知音がまったく鳴らない、メッセージのプレビューが表示されないなど、症状はさまざまです。この問題の背景には、いくつかの原因が考えられます。最近のWhatsAppアップデート、不安定なインターネット接続、データ制限、アプリのキャッシュ、あるいはファームウェアの不具合などが挙げられます。いずれの場合でも、できるだけ早く解決したい厄介なトラブルです。本記事では、Androidデバイスで「WhatsAppの通知が届かない」問題を解決するための、効果的な7つの方法をご紹介します。「WhatsAppの通知が表示されない」問題を解決する7つの対処法1.