2017-09-27 193 views
0

我试图在C中创建一个小型地址簿程序,用户可以输入存储在文本文件中的联系信息。如果用户选择添加新联系人,程序应该询问他们是否在完成后添加另一个联系人。我做了一个if语句,如果他们输入'n',或者如果他们另外写入其他联系人,则认为应该结束循环。但是,如果用户键入'y'(或其他任何东西),它总是在1循环后退出。虽然while循环始终在第一个循环后退出

void new_contact(void){ 
    printf("Ready for new contact\n"); 
    int enter_new_contact = 1; 
    char first_name[15]; 
    char second_name[20]; 
    char phone_number[12]; 
    char email[50]; 
    char y_n[1]; 
    do{ 
     printf("Enter the contacts first name.\n"); 
     scanf("%s", first_name); 

     printf("Enter the contacts second name.\n"); 
     scanf("%s", second_name); 

     printf("Enter the contacts phone number.\n"); 
     scanf("%s", phone_number); 

     printf("Enter the contacts email.\n"); 
     scanf("%s", email); 

     printf("%s\t%s\t%s\t%s\n", first_name, second_name, phone_number, email); 

     printf("Would you like to add another contact?\n"); 
     scanf("%s", y_n); 
     printf("%s\n", y_n); 

     if(strcmp(y_n, "n")==0){ 
      enter_new_contact=0; 
     } 

    }while(enter_new_contact==1); 
} 

在此先感谢!

+4

第一件事:解决不确定的行为,如'焦炭y_n [1];'是不是大到足以容纳一个字符,一个空终止符。 –

+1

'char y_n [1];':这个字符缓冲区太小了。它不能容纳任何明显的字符串。您需要空终止符的空间。当用户输入“是”或“否”时会发生什么? –

回答

4
scanf("%s", y_n); 

你在这里未定义行为时,scanf()函数试图把'\0'y_n,给你分配的只有一个字符。而应该把它声明为

char y_n[2]; 

,改变scanf函数语句

scanf("%1s", y_n); 
+0

为什么不只是'char y_n'而已? – CinCout

+1

@CinCout:扫描字符存在每个字符都被考虑的问题。有很多问题在阅读换行符而不是预期的字符。上述将阅读限制为一个字符的方法也存在问题:当用户输入“是”(这是对该问题的合理答案)时,将只扫描“y”并且下一个联系人的名字将是“es” 。在我看来,'scanf'并不适合交互式输入。 –