鱼C论坛

 找回密码
 立即注册
查看: 2077|回复: 2

[已解决]C语言输入字符串奇怪的BUG

[复制链接]
发表于 2021-9-20 01:09:03 | 显示全部楼层 |阅读模式

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

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

x
我写出了一个关于输入字符串奇怪的BUG,好消息是这个BUG在这个程序里居然能读取字符串,坏消息是离开这段程序或者程序稍微修改一下就报错了
爱了爱了,这就是程序员们的“为什么这样都可以运行”问题吗

首先我知道正常输入字符串应该这么写的
  1. //方法一最正常的申请数组空间然后输入
  2. char YN[1];
  3. scanf("%s",YN);
复制代码

  1. //方法二给指针申请空间然后输入
  2. char *YN=(char *)malloc(sizeof(char)*1);
  3. scanf("%s",YN);
复制代码

  1. //然后这种写法是不行一定会报错的
  2. char *YN;
  3. scanf("%s",YN);
复制代码


但是这种错误的写法却在无意中成功了,而且仅仅只有在这个自定义的函数中可以,怎么试都不成功
已经注释好位置了
  1. void changemessage(struct LIST *orglist)
  2. {
  3.         char name[30];
  4.         int select;
  5.         printf("\n\n\n这里是修改功能,请输入你想查找的联系人:");
  6.         scanf("%s",name);
  7.         struct LIST *compare;
  8.     compare=orglist;
  9.     while(compare!=NULL&&strcmp(compare->name,name)!=0)
  10.     {
  11.             compare=compare->next;
  12.         }
  13.         if(compare==NULL)
  14.         {
  15.                 printf("\n\n没有这位联系人!!\n\n");
  16.         }
  17.         else
  18.         {
  19.                 printf("\n\n查找内容如下:\n\n");
  20.                 printf("联系人:%s",compare->name);
  21.                 printf("\n电话:%d",compare->number);
  22.                 printf("\n\n请确认是否修改这位联系人?(Y/N)");
  23.                 char *YN;                                                              //这里随便定义了一直指针没有申请空间
  24.                 scanf("%s",YN);                                                     //按道理这里是应该报错的,但是却没有!!而且仅仅在这个自定义函数里!!
  25.                 while(strcmp(YN,"Y")!=0 && strcmp(YN,"N")!=0)
  26.                 {
  27.                         printf("\n输入无效信息,请再次输入:");
  28.                         scanf("%s",YN);
  29.                 }
  30.                 if(strcmp(YN,"Y")==0)
  31.                 {
  32.                         do
  33.                         {
  34.                                 printf("\n\n请输入修改的内容:\n1.修改联系人名字\n2.修改联系人电话\n请输入");
  35.                                 scanf("%d",&select);
  36.                                 switch(select)
  37.                                 {
  38.                                         case 1:changename(compare);break;
  39.                                         case 2:changenum(compare);break;
  40.                                         default:break;
  41.                                 }
  42.                         }
  43.                         while(select!=1 && select!=2);
  44.                 }
  45.                 printf("\n\n\n输入任意键调回主菜单");
  46.                 select=getchar();
  47.                 getchar();
  48.         }
复制代码

最佳答案
2021-9-20 10:47:16
一个指针变量没有初始化,那么这个指针变量中存储的地址有 3 种情况
1. 这个指针变量中存储的是一个已经使用过的变量的地址
2. 这个指针变量中存储的是一个还没有使用过的变量的地址
3. 这个指针变量中存储的是一个无效的的地址,例如 0x00001234
如果是你的那个例子,情况 1,程序只要之后不再使用那个被 scanf 覆盖的变量,就不会有任何问题
情况 2 一般来说程序会停止运行,也有可能不会停止运行,如果覆盖进去的值正好是那个变量的取值范围,例如那个变量可以存储 1、2、3,那个变量已经默认初始化成了 3,但是 scanf 把那个变量覆盖成了 1,程序不会停止运行,但是得到的结果一定是不对的
情况 3 程序肯定会停止运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 05:17:44 From FishC Mobile | 显示全部楼层
去验证一段错误的代码,无疑是浪费时间
即便你成功了也没有任何意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-20 10:47:16 | 显示全部楼层    本楼为最佳答案   
一个指针变量没有初始化,那么这个指针变量中存储的地址有 3 种情况
1. 这个指针变量中存储的是一个已经使用过的变量的地址
2. 这个指针变量中存储的是一个还没有使用过的变量的地址
3. 这个指针变量中存储的是一个无效的的地址,例如 0x00001234
如果是你的那个例子,情况 1,程序只要之后不再使用那个被 scanf 覆盖的变量,就不会有任何问题
情况 2 一般来说程序会停止运行,也有可能不会停止运行,如果覆盖进去的值正好是那个变量的取值范围,例如那个变量可以存储 1、2、3,那个变量已经默认初始化成了 3,但是 scanf 把那个变量覆盖成了 1,程序不会停止运行,但是得到的结果一定是不对的
情况 3 程序肯定会停止运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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