2012-04-23 53 views
0

在以下代码中,只要在数组“pass”和“repass”中输入了相同的字符串,“repass”中的字符串就会加倍。例如,如果“pass”和“repass”中的输入字符串是aaaaaaaa,则“repass”中的字符串变成aaaaaaaaaaaaaaaa,因为strcmp()会给出否定答案。为什么打印输入缓冲区会导致意外输出?

有人可以帮助解释背后的原因吗?

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

void main() 
{ 
    char user_name[20],pass[8],repass[8]; 
    int i=0,c=0,tr=1;//tr for no of try(should less than 3) 
    clrscr(); 
    puts("enter user name"); 
    gets(user_name); 
    printf("\n\n\n\n"); 

    for(tr=1;tr<=3;tr++) 
    { 
     puts("\n\nenter password"); 

     while(i<8) 
     { 
      pass[i] = getch(); 
      putchar('*'); 
      i++; 
     } 

     printf("\n\n\n\nplease reenter the password\n\n"); 
     i=0; 

     while(i<8) 
     { 
      repass[i]=getch(); 
      putchar('*'); 
      i++; 
     } 

     c=strcmp(pass, repass); 
     printf("c=%d", c); 

     if(strcmp(pass,repass)==0) 
      c=0; 
     else 
      c++; 

     if(c==0) 
     { 
      printf("\n\n\t****\vsuccessful login*********** "); 
      break; 
     } 
     else 
      printf("\n\nsorry password did not match"); 
    } 

    if(tr>3) 
     puts("\n\nlogin failed"); 
    //printf("%s  %s",pass,repass); 
    getch(); 
} 
+0

请缩进您的代码; SO的建议是每个级别4个空格,没有标签。 – 2012-04-23 17:37:28

+2

另外,他们不教不使用'gets'? – 2012-04-23 17:37:42

回答

2

你不是0终止您的字符串,以便使用他们(用“%s”时,STRCMP等打印)“串”的功能是非法的。

在这种特殊情况下,由于堆栈布局,看起来repass是“加倍”,因此passrepass是一个紧挨着另一个。


副节点,使用fgets instead of gets

+0

+1。实际上发生的事情是,由于'pass'没有空终止符,所以两个栈变量'pass'和'repass'最终构成单个连续字符串的一部分。 – 2012-04-23 17:36:32

+0

@CharlesSalvia Yup,这正是发生的事情。 – cnicutar 2012-04-23 17:37:31

1

这里有一些错误。

  1. 不要使用gets。获取是不安全的。摆脱使用它的习惯。改用scanf。
  2. 你不是null-终止你的字符串。字符串最后需要'\0'表示它们已完成。
  3. 请更好地格式化您的代码。如果你愿意,它会帮助你遵循逻辑。