0

私のプログラムはすべてのデータを取得し、3 つの異なる方法で表示するかどうかを尋ねます。CSV、TSV、XML。2 つの if ステートメントを追加しました。それらを機能させようとすると、表示する設定を選択するように求められ、プログラムが終了します。どうしてこれなの?

#include <stdio.h>
int main (int argc, char *argv[]) {
    int  phoneNumber;
    char firstName[11];
    char lastName[11];
    char eMail[20];
    int output;
    int CSV;
    int TSV;
    int XML;

    printf("Please enter the user's first name:");
    scanf("%s", firstName);
    printf("Please enter the user's last name:");
    scanf("%s", lastName);
    printf("Please enter the user's phone number:");
    scanf("%i", &phoneNumber);
    printf("Please enter the user's e-mail:");
    scanf("%s", eMail);
    printf("What output format would you like? (CSV,TSV/XML) ");
    scanf("%d", &output);

    if (output == 'CSV') {
        printf("firstName,lastName,phoneNumber,eMail");
        printf("%s,%s,%i,%s",firstName, lastName, phoneNumber, eMail);
    }
    else if (output == 'TSV') {
        printf("firstName,\tlastName,\tphoneNumber,\teMail");
        printf("%s,\t%s,\t%i,\t%s", firstName, lastName, phoneNumber, eMail);
    }

}
4

4 に答える 4

6

まず、前述のように、strcmp関数を使用して文字列を比較する必要があります。 ==文字列がコンパイラが生成した定数と同じ場所にあるかどうかをテストしていますが、そうではありません。

#include <string.h>

そして、あなたは使用することができます

if(strcmp(output,"CSV")==0) { /*output CSV*/ }

次に、文字列を区切るの"ではなく、使用する必要があります。単一の文字のみです。''

第 3 に、変数CSVTSV変数に値が与えられることはありません。使用する

char output[256];
scanf("%s", output)

次に、使用できますstrcmp(output, "CSV")(またはstrcasecmp、大文字と小文字を区別するかどうかによって異なります)。

于 2013-10-16T01:50:46.533 に答える
3

必要な変更は次のとおりです。

   printf("What output format would you like? (CSV,TSV/XML) ");
   scanf("%s", &output);
   ...


   if (strcmp(output, "CSV") == 0) {
   // ...
   } else if (strcmp(output, "TSV") == 0) {
   // ...
   }
于 2013-10-16T01:53:55.833 に答える
2

C では、文字列の等価性チェックを で実行しますstrcmp(...)

さらに、文字列リテラルは引用符で囲む必要があります"

#include <string.h>
// ...
if (strcmp(output, "CSV") == 0) {
  // ...
} else if (strcmp(output, "TSV") == 0) {
  // ...
}

[編集]これらの値 (CSV、TSV、XML) を表すために整数を使用しようとしている場合は、次のようにする必要があります。

const int CSV = 1;
const int TSV = 2;
const int XML = 3;
// ...
printf("What output format would you like? (CSV=1,TSV=2,XML=3) ");
scanf("%d", &output);
// ...
if (output == 1/*CSV*/) {
  // ...
} else if (output == 2/*TSV*/) {
  // ...
}
于 2013-10-16T01:48:06.007 に答える
1
int output;
/* ... */
printf("What output format would you like? (CSV,TSV/XML) ");
scanf("%d", &output);

CSVユーザーに、TSV、またはを入力するように求めますが、整数XMLを読み取ります。これを有効にするには、オプションであるか、その後に 10 進数のシーケンスが続く必要があります。+-

if (output == 'CSV') {

'CSV'複数文字の定数です。タイプintは で、実装定義の値があります。その値は、ユーザーが前のプロンプトで入力したものとは何の関係もありません。

(これがエラーなしでコンパイルされるのは残念です。複数文字の定数はほとんど役に立ちません。)

CSVTSV、およびに番号を割り当てXML、それらの番号をユーザーに表示し、数値入力を読み取り、比較することができます。例えば:

const int CSV = 1;
const int TSV = 2;
const int XML = 3;
printf("What output format would you like? (CSV,TSV/XML) ");
scanf("%d", &output); /* error checking omitted for now */
if (output == CSV) {
    /* ... */
}
else if (output == TSV) {
    /* ... */
}
/* ... */

または、文字または文字列に変更outputし、(適切な形式を使用して) それを読み取り、文字または文字列scanfと比較outputすることもできます。

文字列を使用する場合はstrcmp()、 ではなくを使用==して比較する必要があることに注意してください。

によって返される値を必ず確認してくださいscanf。スキャンできたアイテムの数を返します。使用している呼び出しについて、scanf1 以外の値が返された場合は、何らかのエラーが発生したことを意味します (たとえば、foo整数を予期していたときにユーザーが入力したなど)。エラーを報告し、おそらくプログラムを終了する必要があります。 -- または、ループを使用して、有効なものが得られるまでユーザーにプロンプ​​トを表示し続けることもできます。

于 2013-10-16T01:58:21.430 に答える