Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C预订问题_C - Fatal编程技术网

C预订问题

C预订问题,c,C,这是我目前的代码。每次我给出任何选项1、2、3、4时,输入一个条目并按enter键,窗口将关闭。我不确定这个逻辑是否合理,任何建议都是受欢迎的,但对我来说“似乎”没问题,但显然我需要另一双眼睛。我想要它,我不必为我在文件中输入的每个人输入所有条目。另外,要注意的是,我最初只因为它在抱怨而继续写5。。我知道这是个坏习惯。使用如果(选项=1)您说的是“如果我将选项更改为1”,这实际上是保证有效的,但它会破坏以前的值选择,因此非常感谢任何有用的信息 您想从if(choice==1)开始,这意味着“如果

这是我目前的代码。每次我给出任何选项1、2、3、4时,输入一个条目并按enter键,窗口将关闭。我不确定这个逻辑是否合理,任何建议都是受欢迎的,但对我来说“似乎”没问题,但显然我需要另一双眼睛。我想要它,我不必为我在文件中输入的每个人输入所有条目。另外,要注意的是,我最初只因为它在抱怨而继续写5。。我知道这是个坏习惯。使用
如果(选项=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;