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;
}
目前是我的代码。每次我给出任何选项1,2,3,4,输入一个条目并按下进入窗口关闭。我不确定逻辑是否有意义,任何建议都是受欢迎的,但它“似乎”对我来说没问题,但显然我需要另一组眼睛。我想要它,我不必输入我放在文件中的每个人的所有条目。另外,需要注意的是,我最初仅仅因为抱怨而接受了5个...我知道的不好的做法。感谢任何有用的信息
答案 0 :(得分:3)
您的计划结束是因为break;
不在您认为的范围内:
else if (choice = 4){
printf ("Phone number: ");
fgets(entry.phone, sizeof(entry.phone),stdin);
}
else
printf("Exiting");
break;
即使你缩进了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
返回:
if (cont = 'n'|'N')
return 0;
您希望该行说出
if (cont == 'n' || cont == 'N')
return 0;
这些修复程序至少会阻止程序终止,但正如其他人指出的那样,其他地方存在许多逻辑错误会阻止它执行您想要的操作。
答案 1 :(得分:2)
单个=
在C. if (a = 5) { /* always executed! */ }
中将赋值设置为a
为5,然后执行if-branch,因为a = 5
评估为5被认为是真的。
您想要{em}比较值的==
。因此:
if (choice = 1){
应该是
if (choice == 1){
另一件事:
while (choice = 1|2|3|4|cont){
不按照您的想法行事。它实际上是按位计算的,或者是1,2,3,4和cont
。 (因此,仅将=
更改为==
是不够的。)您需要依次比较每个值:
while (choice == 1 || choice == 2 || choice == 3 || choice == 4 || choice == cont){
另请注意使用||
(逻辑OR)而不是按位或。
else
printf("Exiting");
break;
你缺少大括号({
和}
),所以它实际上意味着以下(尽管有误导性的错误):
else
printf("Exiting");
break;
您的代码可能有更多错误。
答案 2 :(得分:2)
例如,以下行:
while (choice = 1|2|3|4|cont){
掩盖了对一些基本概念的误解。
首先=
是分配运算符。除其他外,上述代码会更改choice
的值。使用==
进行相等比较。
其次,|
运算符是按位或。 1|2|3|4|5
的值是7
(我会留给你找出原因)。相反,请使用||
,如下所示:
while (choice == 1 || choice == 2 || choice == 3 || choice == 4 || choice == cont) {
您的代码中还有其他类似的错误。
答案 3 :(得分:1)
通过使用if (choice = 1)
,你说“如果我将选择更改为1”几乎可以保证有效,但它会破坏之前保留的价值选择。
你想从if (choice == 1)
开始,这意味着“如果我将选择与2比较,这是否相同?”。