鱼C论坛

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

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

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

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

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

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

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

  7.     printf("**********登入**********\n");
  8.     printf("請輸入帳號:");
  9.     input(5,inpacc);
  10.     printf("請輸入密碼:");
  11.     input(5,inppass);
  12.     printf("帳號:%s\n",inpacc);
  13.     printf("密碼:%s\n",inppass);

  14.    
  15.     return 0;
  16. }

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

  19.     int i;
  20.     for(i=0;i<a;++i)
  21.     {
  22.         c[i] = getchar();
  23.     }
  24.     for(i=0;i<a;i++)
  25.     {
  26.         printf("%c",c[i]);
  27.     }
  28.     printf("\n");
  29. }
复制代码
螢幕快照 2014-02-15 下午8.33.25.png     螢幕快照 2014-02-15 下午8.35.45.png
圖一                                                                         圖二


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

但是怎像測是都無法 正常取出都會有亂碼好像多出來字元還在 不知道哪有問題請各位前輩給點指導
附上輸出結果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2014-2-15 21:13:27 From FishC Mobile | 显示全部楼层
看看???!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-15 21:42:11 | 显示全部楼层
本帖最后由 BaiBai2011 于 2014-2-15 21:54 编辑
  1. #include <stdio.h>
  2. void input(int ,char []);
  3. int main(int argc, const char * argv[])
  4. {
  5.     char inpacc[5+2]= {0};
  6.     char inppass[5+2]={0};

  7.     printf("**********登入**********\n");
  8.     printf("請輸入帳號:");
  9.     input(5,inpacc);
  10.     printf("請輸入密碼:");
  11.     input(5,inppass);
  12.     printf("帳號:%s\n",inpacc);
  13.     printf("密碼:%s\n",inppass);

  14.    
  15.     return 0;
  16. }

  17. void input(int a,char *c)
  18. {
  19.     int i;
  20.     for(i=0;i<a+1;i++)
  21.     {
  22.         c[i] = getchar();
  23.     }
  24.     for(i=0;i<a;i++)
  25.     {
  26.         printf("%c",c[i]);
  27.     }
  28.     printf("\n");
  29. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-15 21:55:09 | 显示全部楼层
这回对了吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

當使用者在帳號輸入123456789 密碼輸入abscefgh
若限定只取5字元 應取得 帳號12345 密碼abcde
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-16 00:25:48 | 显示全部楼层
我稍微解開這問題
但請各位前輩找找毛病建議一下
  1. #include <stdio.h>
  2. void input(int ,char []);
  3. int main(int argc, const char * argv[])
  4. {
  5.     //取最大5個字元因為最後一位為'\0'所以5+1
  6.     char inpacc[6];
  7.     char inppass[6];
  8.    
  9.     printf("**********登入**********\n");
  10.     printf("請輸入帳號:");
  11.     input(6,inpacc);
  12.     rewind(stdin);//成功清除多出的輸入字元
  13.     fflush(stdin);//失敗無法清除多出的輸入字元
  14.     printf("請輸入密碼:");
  15.     input(6,inppass);//失敗無法清除多出的輸入字元
  16.     rewind(stdin);//成功清除多出的輸入字元
  17.     fflush(stdin);
  18.     printf("帳號:%s",inpacc);
  19.     printf("密碼:%s",inppass);

  20.      return 0;
  21. }

  22. void input(int a,char *c)
  23. {
  24.     int i;
  25.     //a-1 因為只取5位最後一位為'/0'
  26.     for(i=0;i<a-1;i++)
  27.     {
  28.         c[i] = getchar();
  29.         //這邊判定一下是否輸入是enter 使用者若只輸入一個字元就輸入enter 為達5字元 會無判定將卡住
  30.         if(c[i]==10)
  31.         {
  32.             break;
  33.         }
  34.     }
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-16 07:48:31 | 显示全部楼层
  1. #include <stdio.h>
  2. #define IN_PUST_MAX 500

  3. void input(char []);

  4. int main(int argc, const char * argv[])
  5. {
  6.     char inpacc[IN_PUST_MAX+2]= {0};
  7.     char inppass[IN_PUST_MAX+2]={0};

  8.     printf("**********登入**********\n");
  9.     printf("請輸入帳號:");
  10.     input(inpacc);
  11.     printf("請輸入密碼:");
  12.     input(inppass);
  13.     printf("帳號:%s\n",inpacc);
  14.     printf("密碼:%s\n",inppass);

  15.     return 0;
  16. }

  17. void input(char *c)
  18. {
  19.     int i;
  20.     for(i=0;;i++)
  21.     {
  22.         c[i] = getchar();
  23.                 if(c[i] == '\n')
  24.                 {
  25.                         c[i] = 0;
  26.                         break;
  27.                 }
  28.     }
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 10:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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