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*/ }

其次,您需要使用"而不是'分隔字符串;'仅适用于单个字符。

第三,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);

您要求用户输入CSVTSVXML,但随后您读取了一个整数,该整数必须是可选的+-后跟一系列十进制数字才能有效。

if (output == 'CSV') {

'CSV'是一个多字符常量。它是 type int,并且有一个实现定义的值。该值与用户在前一个提示中输入的内容无关。

(不幸的是,这编译没有错误。多字符常量几乎没用。)

您可以将数字分配给CSVTSVXML,向用户显示这些数字,读取数字输入,然后进行比较。例如:

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。它返回它能够扫描的项目数。对于您正在使用的调用,如果scanf返回 1 以外的值,则表示存在某种错误(例如,用户foo在您期望整数时键入),您需要报告错误并可能退出程序- 或者可能使用循环继续提示用户,直到你得到有效的东西。

于 2013-10-16T01:58:21.430 回答