2016-09-25 3 views
0

生徒1の名前が空白であるかどうかを確認するコードを作成し、 。ただし、このコードを使用すると、そのメッセージは表示されません。私がenterを押すと、実際に何かを入力するまでカーソルが次の行に移動します。これもstrcmpで試してみましたが、何も動作しません。Cで文字列が空であることを確認する方法(これまでに何もできていない)

#include <stdio.h> 
#include <string.h> 
{ 

char charStudent1FirstName[50] = ""; 

printf("Please enter Student 1's First name: "); 
scanf("%s", &charStudent1FirstName); 

if (charStudent1FirstName[0] == '\0') 
    { 
     printf("Please input Student 1's first name again: "); 
     scanf("%s", &charStudent1FirstName); 
    } 
} 
+1

可能な重複(https://stackoverflow.com/questions/9609662/idiomatic-way-of- char-check-for-empty-string-in-c?rq = 1) – Barnabus

+2

'&charStudent1FirstName'ではなく、' charStudent1FirstName'が必要であることに注意してください。あなたのコンパイラはあなたに警告していませんでしたか? – smarx

+0

@BarnabusそれはOPの実際の問題ではありません。 – jamesdlin

答えて

3

ここに私が変わっものです:

  1. 使用fgets代わりscanfの。つまり、空白行が表示されている場合は、空行が実際に表示されます。
  2. fgets結果から改行を削除します。
  3. &charStudent1FirstNameの代わりにcharStudent1FirstNameを使用してください。あなたはchar*を渡したいと思いますが、char**ではありません。コンパイラがこれについて警告しない場合は、別のコンパイラを使用するか、コンパイル設定を変更することを検討してください。
  4. ループを使用すると、入力するまで何度でも名前を入力するように求められます。

完全作業コード:[Cに空の文字列をチェックする慣用的な方法]の

#include <stdio.h> 
#include <string.h> 

int main() { 

    char charStudent1FirstName[50] = ""; 

    while (charStudent1FirstName[0] == 0) { 
     printf("Please input Student 1's first name: "); 
     fgets(charStudent1FirstName, 50, stdin); 
     charStudent1FirstName[strcspn(charStudent1FirstName, "\n")] = 0; 
    } 

    printf("First name: %s\n", charStudent1FirstName); 
} 
3

空の文字列を確認する方法は何も問題ありません。問題はscanf, which is notoriously hard to useを使用していることです。 scanfは、おそらく期待通りに空白を処理します。ベースの入力ですが、scanfはのストリームを読み取ります。 scanfは改行を気にしないので、空白以外の文字を入力して空の文字列を取得しない限り、あなたの場合は何も読み込まれません。

fgets(または使用可能な場合はPOSIX getline)を使用して行全体を読み取ってから、その行を(必要に応じて)sscanfで解析する必要があります。 (fgetsは、文字列の最後に改行を残すことができることに注意してくださいので、あなたはそれを取り除く必要があります。)


はおそらく死んだ馬を破って、あなたが制限するものではありませんのでscanfの使用状況も危険なです書き込み可能なデータの量はcharStudent1FirstNameであり、その結果、ユーザーは簡単に宛先バッファーをオーバーフローさせる可能性があります。文字列を読み取るときにscanfを安全に使用するためにいくつかのフープをジャンプすることは可能ですが、fgets/getlineを使用するとこれらの問題を回避できます。 (。また、fgets/getlineを使用すると、あなたが引数、ない&charStudent1FirstNameとしてcharStudent1FirstNameを渡すべきであること、それがより明白になるだろう)

関連する問題