【发布时间】: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