arnold0613 发表于 2014-2-15 20:38:58

登入帳號密碼輸入取出輸入的值一直有錯

我在在帖子http://bbs.fishc.com/thread-43473-1-1.html]scanf 輸入字串大於數組長度怎不會報錯 牡丹指導下 將程序修該如下

#include <stdio.h>
void input(int ,char []);
int main(int argc, const char * argv[])
{
    char inpacc;
    char inppass;

    printf("**********登入**********\n");
    printf("請輸入帳號:");
    input(5,inpacc);
    printf("請輸入密碼:");
    input(5,inppass);
    printf("帳號:%s\n",inpacc);
    printf("密碼:%s\n",inppass);

   
    return 0;
}

void input(int a,char c[])
{

    int i;
    for(i=0;i<a;++i)
    {
      c = getchar();
    }
    for(i=0;i<a;i++)
    {
      printf("%c",c);
    }
    printf("\n");
}   
圖一                                                                         圖二


我需求只是一般登入 在使用者任意輸入帳號長度與密碼長度後按下entet 取出5碼做比對

但是怎像測是都無法 正常取出都會有亂碼好像多出來字元還在 不知道哪有問題請各位前輩給點指導
附上輸出結果

竹林小溪 发表于 2014-2-15 21:06:36

简单的说就是数组溢出,一开始向内存申请了2*5字节的内存,然后分别赋值,如果第二个字符串的长度超过5的话,就会覆盖第一个数组。如果再长的话,就会继续覆盖其他数据,后面的乱码就是超出范围后内存空间里的内容。

cyn940518 发表于 2014-2-15 21:13:27

看看???!!!!!!

BaiBai2011 发表于 2014-2-15 21:42:11

本帖最后由 BaiBai2011 于 2014-2-15 21:54 编辑

#include <stdio.h>
void input(int ,char []);
int main(int argc, const char * argv[])
{
    char inpacc= {0};
    char inppass={0};

    printf("**********登入**********\n");
    printf("請輸入帳號:");
    input(5,inpacc);
    printf("請輸入密碼:");
    input(5,inppass);
    printf("帳號:%s\n",inpacc);
    printf("密碼:%s\n",inppass);

   
    return 0;
}

void input(int a,char *c)
{
    int i;
    for(i=0;i<a+1;i++)
    {
      c = getchar();
    }
    for(i=0;i<a;i++)
    {
      printf("%c",c);
    }
    printf("\n");
}

BaiBai2011 发表于 2014-2-15 21:55:09

这回对了吧。

arnold0613 发表于 2014-2-15 22:18:52

BaiBai2011 发表于 2014-2-15 21:55 static/image/common/back.gif
这回对了吧。

還是發生如2樓前輩所講的溢出

當使用者在帳號輸入123456789 密碼輸入abscefgh
若限定只取5字元 應取得 帳號12345 密碼abcde

arnold0613 发表于 2014-2-16 00:25:48

我稍微解開這問題
但請各位前輩找找毛病建議一下#include <stdio.h>
void input(int ,char []);
int main(int argc, const char * argv[])
{
    //取最大5個字元因為最後一位為'\0'所以5+1
    char inpacc;
    char inppass;
   
    printf("**********登入**********\n");
    printf("請輸入帳號:");
    input(6,inpacc);
    rewind(stdin);//成功清除多出的輸入字元
    fflush(stdin);//失敗無法清除多出的輸入字元
    printf("請輸入密碼:");
    input(6,inppass);//失敗無法清除多出的輸入字元
    rewind(stdin);//成功清除多出的輸入字元
    fflush(stdin);
    printf("帳號:%s",inpacc);
    printf("密碼:%s",inppass);

   return 0;
}

void input(int a,char *c)
{
    int i;
    //a-1 因為只取5位最後一位為'/0'
    for(i=0;i<a-1;i++)
    {
      c = getchar();
      //這邊判定一下是否輸入是enter 使用者若只輸入一個字元就輸入enter 為達5字元 會無判定將卡住
      if(c==10)
      {
            break;
      }
    }
}

BaiBai2011 发表于 2014-2-16 07:48:31

#include <stdio.h>
#define IN_PUST_MAX 500

void input(char []);

int main(int argc, const char * argv[])
{
    char inpacc= {0};
    char inppass={0};

    printf("**********登入**********\n");
    printf("請輸入帳號:");
    input(inpacc);
    printf("請輸入密碼:");
    input(inppass);
    printf("帳號:%s\n",inpacc);
    printf("密碼:%s\n",inppass);

    return 0;
}

void input(char *c)
{
    int i;
    for(i=0;;i++)
    {
      c = getchar();
                if(c == '\n')
                {
                        c = 0;
                        break;
                }
    }
}
页: [1]
查看完整版本: 登入帳號密碼輸入取出輸入的值一直有錯