C预订问题
这是我目前的代码。每次我给出任何选项1、2、3、4时,输入一个条目并按enter键,窗口将关闭。我不确定这个逻辑是否合理,任何建议都是受欢迎的,但对我来说“似乎”没问题,但显然我需要另一双眼睛。我想要它,我不必为我在文件中输入的每个人输入所有条目。另外,要注意的是,我最初只因为它在抱怨而继续写5。。我知道这是个坏习惯。使用C预订问题,c,C,这是我目前的代码。每次我给出任何选项1、2、3、4时,输入一个条目并按enter键,窗口将关闭。我不确定这个逻辑是否合理,任何建议都是受欢迎的,但对我来说“似乎”没问题,但显然我需要另一双眼睛。我想要它,我不必为我在文件中输入的每个人输入所有条目。另外,要注意的是,我最初只因为它在抱怨而继续写5。。我知道这是个坏习惯。使用如果(选项=1)您说的是“如果我将选项更改为1”,这实际上是保证有效的,但它会破坏以前的值选择,因此非常感谢任何有用的信息 您想从if(choice==1)开始,这意味着“如果
如果(选项=1)
您说的是“如果我将选项更改为1”,这实际上是保证有效的,但它会破坏以前的值选择,因此非常感谢任何有用的信息
您想从
if(choice==1)
开始,这意味着“如果我将choice与2进行比较,这是否相等?”。单个=
在C中进行赋值。if(A=5){/*始终执行!*/}
将A
设置为5,然后执行if分支,因为A=5
计算为5,这被认为是真的
您需要比较值的==
。因此:
typedef struct contact {
char firstname [40];
char lastname [40];
char address [100];
char phone[10];
}contact;
int main ()
{
FILE *pFile;
contact entry = {"", "", "", ""};
int choice;
char cont = 5;
pFile = fopen("C:\\contacts.txt", "w+");
if(!pFile){
printf("File could not be open");
return 1;
}
printf("Choose a selection\n\n");
printf("1. Enter First Name\n");
printf("2. Enter Last Name\n");
printf("3. Enter Address\n");
printf("4. Enter Phone Number\n\n");
scanf( "%d", &choice);
while (choice = 1|2|3|4|cont){
if (choice = 1){
printf ("First name: ");
fgets(entry.firstname, sizeof(entry.firstname),stdin);
}
else if(choice = 2){
printf ("Last name: ");
fgets(entry.lastname, sizeof(entry.lastname),stdin);
}
else if(choice = 3){
printf ("Address: ");
fgets(entry.address, sizeof(entry.address),stdin);
}
else if (choice = 4){
printf ("Phone number: ");
fgets(entry.phone, sizeof(entry.phone),stdin);
}
else
printf("Exiting");
break;
fwrite (&entry, sizeof (struct contact), 1, pFile);
printf ("Would you like to enter a new contact? (y/n)");
scanf ("%d", &cont);
if (cont = 'n'|'N')
return 0;
}
fclose(pFile);
getchar();
return 0;
}
应该是
if (choice = 1){
还有一件事:
if (choice == 1){
它实际上是在计算1、2、3、4和cont
的位或(因此仅将=
更改为=
是不够的)。您需要依次比较每个值:
while (choice = 1|2|3|4|cont){
还要注意使用|
(逻辑OR)而不是按位OR
编辑:程序过早退出的原因是:
while (choice == 1 || choice == 2 || choice == 3 || choice == 4 || choice == cont){
您缺少大括号({
和}
),因此它实际上意味着以下内容(尽管缩进有误导性):
您的代码可能有更多错误。例如,下面一行:
else
printf("Exiting");
break;
掩盖了对一些基本概念的误解
第一个=
是赋值运算符。除其他外,上面的代码更改选项的值。使用=
进行相等比较
其次,
运算符是一个位or。1 | 2 | 3 | 4 | 5
的值是7
(我将留待您在某个时候找出原因)。相反,请像这样使用|
:
while (choice = 1|2|3|4|cont){
代码中还有其他类似错误。程序结束,因为中断;
不在您认为的范围内:
while (choice == 1 || choice == 2 || choice == 3 || choice == 4 || choice == cont) {
即使您缩进了break
,它也不属于else子句。因此,无论if/else块中发生了什么,执行break
,程序脱离循环并结束
若要修复此问题,请添加大括号以将中断括在else
的范围内:
else if (choice = 4){
printf ("Phone number: ");
fgets(entry.phone, sizeof(entry.phone),stdin);
}
else
printf("Exiting");
break;
一旦你修复了它,这一行将导致你的程序终止,因为它的计算结果总是true
,并从main
返回:
else if (choice = 4){
printf ("Phone number: ");
fgets(entry.phone, sizeof(entry.phone),stdin);
}
else
{
printf("Exiting");
break;
}
你想让那句话说
if (cont = 'n'|'N')
return 0;
这些修复至少会阻止您的程序终止,但正如其他人所指出的,其他地方存在许多逻辑错误,会阻止它执行您想要的操作。请启用编译器上的所有警告。=
和=
之间有一个非常重要的区别,您将被忽略现在,你的while
构造也完全不能做你认为它能做的事。虚拟保证?1
是真的;它是有保证的。没有上下文的那行代码可以引用int const choice=5;
(假设ANSI C)。“虚拟保证。”“是一个很好的weasel子句,可以用来阻止所有的‘但是在这种情况下,我不得不告诉你你错了’人群。分配到const
变量需要进行诊断吗?正如你所说,我做了这些更改,我的屏幕仍然关闭,也没有向文件写入任何内容。有什么建议吗?再次感谢你的建设性回答
if (cont = 'n'|'N')
return 0;
if (cont == 'n' || cont == 'N')
return 0;