2012-04-23 2 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 пробела на уровне, без вкладок. –

+2

Кроме того, разве они не учат не использовать 'gets' ??? –

ответ

2

Вы не 0 оконечное ваши строки так, используя «строка» функции на них (печать с «% S», STRCMP и т.д.), является незаконным.

В этом конкретном случае это выглядит так: repass «удваивается» из-за расположения стека, путь pass и repass один рядом друг с другом.


Боковой узел, используйте fgets instead of gets.

+0

+1. На самом деле происходит то, что, поскольку 'pass' не имеет нулевого терминатора, две переменные стека' pass' и 'repass' в конечном итоге образуют часть единственной непрерывной строки. –

+0

@CharlesSalvia Yup, это именно то, что происходит. – cnicutar

1

Здесь что-то не так.

  1. Не использовать получение. Получает небезопасно. Выйди из привычки его использовать. Вместо этого используйте scanf.
  2. Вы не завершаете нумерацию строк. Строки требуют '\0' в конце, чтобы сообщить, что они сделаны.
  3. Пожалуйста, отформатируйте свой код лучше. Это поможет вам следовать логике, если вы это сделаете.
Смежные вопросы