2010-09-24 50 views
2

我有这个简单的问题,从用户使用函数获取输入,然后检查输入是否等于“密码”。然而,strcmp永远不会返回我想要的值,而罪魁祸首是在我的循环中的某处使用getch()分别获取每个字符并将它们添加到字符数组中。通过让printf显示字符数组,我发现了这一点。如果我输入密码,函数会显示为密码“我不知道为什么在我输入的单词后面的数组中包含了结束双引号和空格。任何想法?下面是代码。谢谢。一个简单的getch()和strcmp问题

#include <stdio.h> 
#include <iostream> 
#include <conio.h> 
#include <string.h> 

int validateUser(); 

int main() 
{ 
    for(int x = 0;x<2;x++) 
    { 
     if(validateUser()) 
     { 
      system("cls"); 
      printf("\n\n\t\t** Welcome **"); break; 
     } 
     else      
     { 
      system("cls"); 
      printf("\n\n\t\tIntruder Alert!"); 
      system("cls"); 
     } 
    } 


    system("PAUSE>nul"); 
    return 0; 
} 

int validateUser() 
{ 
    char password[9]; 
    char validate[] = "pass word"; 
    int ctr = 0, c; 
    printf("Enter password : "); 
    do 
    { 
     c = getch(); 
     if(c == 32) 
     { 
      printf(" "); 
      password[ctr] = c; 
     } 

     if(c != 13 && c != 8 && c != 32) 
     { 
      printf("*"); 
      password[ctr] = c; 
     } 
     c++;  
    }while(c != 13); 

    return (!strcmp(password, validate)); 
} 
+0

我看到你已经改变了数组的大小。请您在收到答案后不要这样做。现在我的回答没有意义。 – codaddict 2010-09-24 04:57:29

+0

你也改变了'C++'为'ctr ++',这使得用户@joshD的答案完全无用。请恢复更改。 – codaddict 2010-09-24 05:03:18

+0

对不起,先生,这些只是错别字,但我现在将恢复它。 – arscariosus 2010-09-24 05:08:38

回答

6
  • 您的字符数组password不包含 具有终止空字符
  • 你需要确保你不 东西超过8焦炭引入 password
  • c++应该ctr++

do { 
// stuff char into password. 
ctr++; 
}while(c != 13 && ctr <8); 

password[ctr] = 0; 
+0

哦,所以我必须在用户按下输入先生之后明确添加/ 0吗? – arscariosus 2010-09-24 04:47:14

+1

是的。你是对的。 – codaddict 2010-09-24 04:53:14

+0

其实它的'\ 0'的值是'0',所以你可以分配'0' – codaddict 2010-09-24 05:00:11

0

getch()是一个非标准的头文件中定义<conio.h>的功能,依靠非标准的特性,不建议当你想你的代码移植。:)

+0

我知道这位先生,但这些信息会以怎样的方式帮助我? – arscariosus 2010-09-24 04:46:20

+1

它可能会提示你寻找替代品,或者使用''的C风格,或者使用std :: cin的成员函数的C++风格。同样,'\ n''是换行符的可移植表示法,这是硬编码ASCII 13(回车代码,很少用于DOS/Windows外部)的一种很好的替代方法。当你刚开始学习编码时不是优先考虑的事情。 – 2010-09-24 05:29:04

2

你正在递增循环中的c。你应该增加ctr。此外,所有其他人都说过的东西(空终止符,只有8个字符等)。