C预订问题

时间:2011-11-22 17:43:44

标签: c

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个...我知道的不好的做法。感谢任何有用的信息

4 个答案:

答案 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比较,这是否相同?”。