【问题标题】:C struct with switch case, input line skipping带开关盒的 C 结构,输入跳行
【发布时间】:2018-07-21 01:14:18
【问题描述】:

所以我决定使用我在过去的程序中使用过的开关盒。它按预期工作,除了每种情况的第一行,输入帐户名称跳过它的输入行。我相信这很简单,而且我已经做了一段时间了。下面是代码,只是试图让该行允许输入,而不是保存到文件中,并在提示继续处理我的案例时继续保存输入。

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


struct account 
{
char company_name[256];
int invoice_number;
int invoice_date;
float invoice_amount;

};


int main() 
{
char *end;
char buf[256];
char y;
char n;
char a;
FILE *newacct;
struct account ledger;
newacct = fopen("robco.txt", "a");



printf("Enter Account Name:");
fgets(ledger.company_name, sizeof(ledger.company_name), stdin);
ledger.company_name[strlen(ledger.company_name)-1] = '\0';
printf("Enter Incoive Number:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_number = strtol(buf, &end, 10);
printf("Enter Invoice Date:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_date = strtol(buf, &end, 10);
printf("Enter Invoice Amount:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_amount = strtol(buf, &end, 10);
fprintf(newacct,"%s %d %d %f\n", ledger.company_name, ledger.invoice_number, 
ledger.invoice_date, ledger.invoice_amount);
fclose(newacct);



printf("Would you like to enter more data?:");
scanf("%s", &a);


switch (a){

case'n':

printf("Thanks for your entry!"); //should terminate
fprintf(newacct,"\n%s %d %d %f", ledger.company_name, ledger.invoice_number, 
ledger.invoice_date, ledger.invoice_amount);
fclose(newacct);

return 0;

case'y':    
FILE *newacct;
struct account ledger;
newacct = fopen("robco.txt", "a");

printf("Enter Account Name:"); //the line that keeps skipping in every switch 
case.
fgets(ledger.company_name, sizeof(ledger.company_name), stdin); //it prints 
however it skips this input line.
ledger.company_name[strlen(ledger.company_name)-1] = '\0';
printf("\nEnter Incoive Number:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_number = strtol(buf, &end, 10);
printf("Enter Invoice Date:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_date = strtol(buf, &end, 10);
printf("Enter Invoice Amount:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_amount = strtol(buf, &end, 10);
fprintf(newacct,"%s %d %d %f\n", ledger.company_name, ledger.invoice_number, 
ledger.invoice_date, ledger.invoice_amount);
fclose(newacct);

break;
}
printf("Would you like to enter more data?:");
scanf("%s", &a);


switch (a){

case'n':

printf("Thanks for your entry!"); //should terminate
fprintf(newacct,"\n%s %d %d %f", ledger.company_name, ledger.invoice_number, 
ledger.invoice_date, ledger.invoice_amount);
fclose(newacct);

return 0;

case'y':
FILE *newacct;
struct account ledger;
newacct = fopen("robco.txt", "a");

printf("Enter Account Name:");
fgets(ledger.company_name, sizeof(&ledger.company_name), stdin);
ledger.company_name[strlen(ledger.company_name)-1] = '\0';
printf("Enter Incoive Number:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_number = strtol(buf, &end, 10);
printf("Enter Invoice Date:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_date = strtol(buf, &end, 10);
printf("Enter Invoice Amount:");
fgets(buf, sizeof(buf), stdin);
ledger.invoice_amount = strtol(buf, &end, 10);
fprintf(newacct,"%s %d %d %f\n", ledger.company_name, ledger.invoice_number, 
ledger.invoice_date, ledger.invoice_amount);
fclose(newacct);

break;
}
}

【问题讨论】:

  • 所以去掉 q 并插入 newacct
  • 请使您的源代码可读:1)在编辑器中将其以良好的形式呈现,2)将其复制并粘贴到 StackOverfow“添加问题”编辑框中,3)选择代码 4)按Ctrl+K 5) 感到高兴。
  • 请正确缩进您的代码,使其可读。此外,Stack Overflow 不是免费的调试服务,您应该展示您使用调试器或其他更简单的方法(例如调试打印语句)调试代码的尝试。您可以尝试的另一件事是分别测试代码的每个部分,以准确找出导致问题的代码部分,并创建minimal reproducible example。这不是您唯一一次在代码中遇到错误,学习调试程序比让别人为您找到错误对您的帮助要大得多。
  • 请参阅idownvotedbecau.se/nodebugging 和idownvotedbecau.se/unreadablecode,了解有关如何改进您的问题的更多信息。
  • 感谢我在 Dev C 上的调试器不配合它没有显示任何内容。

标签: c loops while-loop


【解决方案1】:

这里有一些代码可以帮助您。注意我avoided usingscanf:

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

struct account {
    int account_number;
    char last_name[32];
};

int main(void) {
    char buf[256];
    char *end;
    FILE *newacct;
    struct account ledger;
    newacct = fopen("robco.txt", "a");

    // collect last name from stdin
    printf("Enter last name: ");
    fgets(ledger.last_name, sizeof(ledger.last_name), stdin);
    ledger.last_name[strlen(ledger.last_name)-1] = '\0';

    // collect account number from stdin
    printf("Enter account number: ");
    fgets(buf, sizeof(buf), stdin);
    ledger.account_number = strtol(buf, &end, 10);

    // write to file
    fprintf(newacct, "%s %d\n", ledger.last_name, ledger.account_number);
    fclose(newacct);

    // read and print contents of file
    newacct = fopen("robco.txt", "r");

    while (fscanf(newacct, "%s %d", ledger.last_name, &ledger.account_number) != EOF) {
        printf("%s %d\n", ledger.last_name, ledger.account_number);
    }

    fclose(newacct);
    return 0;
}

关于您的代码的一些简短说明:

  • fscanf 和 feof 应该将文件指针作为第一个参数。
  • 将对整数的引用传递给fscanf,而不是整数本身。
  • 您的结构有一个指向 char 的指针,但在任何时候都没有确定大小和分配内存 - 您可以在运行时动态地 malloc 或在编译时如上所述预先分配它。李>

【讨论】:

  • 谢谢我试过你的,它运行良好。我从acct中取出读取。但是,我插入了一个开关盒,我想让程序允许用户输入,直到用户终止或最多 8-10 个输入。刚接触这一切,并快速尝试一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 2013-05-15
相关资源
最近更新 更多