鱼C论坛

 找回密码
 立即注册
查看: 2738|回复: 7

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

[复制链接]
发表于 2014-2-15 20:38:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在在帖子[url=scanf 輸入字串大於數組長度怎不會報錯 http://bbs.fishc.com/thread-43473-1-1.html]scanf 輸入字串大於數組長度怎不會報錯[/url] 牡丹指導下 將程序修該如下
#include <stdio.h>
void input(int ,char []);
int main(int argc, const char * argv[])
{
    char inpacc[5];
    char inppass[5];

    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[i] = getchar();
    }
    for(i=0;i<a;i++)
    {
        printf("%c",c[i]);
    }
    printf("\n");
}
螢幕快照 2014-02-15 下午8.33.25.png     螢幕快照 2014-02-15 下午8.35.45.png
圖一                                                                         圖二


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

但是怎像測是都無法 正常取出都會有亂碼好像多出來字元還在 不知道哪有問題請各位前輩給點指導
附上輸出結果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-15 21:06:36 | 显示全部楼层
简单的说就是数组溢出,一开始向内存申请了2*5字节的内存,然后分别赋值,如果第二个字符串的长度超过5的话,就会覆盖第一个数组。如果再长的话,就会继续覆盖其他数据,后面的乱码就是超出范围后内存空间里的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-15 21:13:27 From FishC Mobile | 显示全部楼层
看看???!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[5+2]= {0};
    char inppass[5+2]={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[i] = getchar();
    }
    for(i=0;i<a;i++)
    {
        printf("%c",c[i]);
    }
    printf("\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-15 21:55:09 | 显示全部楼层
这回对了吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-15 22:18:52 | 显示全部楼层

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

當使用者在帳號輸入123456789 密碼輸入abscefgh
若限定只取5字元 應取得 帳號12345 密碼abcde
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[6];
    char inppass[6];
    
    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[i] = getchar();
        //這邊判定一下是否輸入是enter 使用者若只輸入一個字元就輸入enter 為達5字元 會無判定將卡住
        if(c[i]==10)
        {
            break;
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[IN_PUST_MAX+2]= {0};
    char inppass[IN_PUST_MAX+2]={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[i] = getchar();
                if(c[i] == '\n')
                {
                        c[i] = 0;
                        break;
                }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表