GmiaoC 发表于 2021-9-20 01:09:03

C语言输入字符串奇怪的BUG

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

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

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

//然后这种写法是不行一定会报错的
char *YN;
scanf("%s",YN);

但是这种错误的写法却在无意中成功了,而且仅仅只有在这个自定义的函数中可以,怎么试都不成功
已经注释好位置了
void changemessage(struct LIST *orglist)
{
        char name;
        int select;
        printf("\n\n\n这里是修改功能,请输入你想查找的联系人:");
        scanf("%s",name);
        struct LIST *compare;
    compare=orglist;
    while(compare!=NULL&&strcmp(compare->name,name)!=0)
    {
            compare=compare->next;
        }
        if(compare==NULL)
        {
                printf("\n\n没有这位联系人!!\n\n");
        }
        else
        {
                printf("\n\n查找内容如下:\n\n");
                printf("联系人:%s",compare->name);
                printf("\n电话:%d",compare->number);
                printf("\n\n请确认是否修改这位联系人?(Y/N)");
                char *YN;                                                            //这里随便定义了一直指针没有申请空间
                scanf("%s",YN);                                                   //按道理这里是应该报错的,但是却没有!!而且仅仅在这个自定义函数里!!
                while(strcmp(YN,"Y")!=0 && strcmp(YN,"N")!=0)
                {
                        printf("\n输入无效信息,请再次输入:");
                        scanf("%s",YN);
                }
                if(strcmp(YN,"Y")==0)
                {
                        do
                        {
                                printf("\n\n请输入修改的内容:\n1.修改联系人名字\n2.修改联系人电话\n请输入");
                                scanf("%d",&select);
                                switch(select)
                                {
                                        case 1:changename(compare);break;
                                        case 2:changenum(compare);break;
                                        default:break;
                                }
                        }
                        while(select!=1 && select!=2);
                }
                printf("\n\n\n输入任意键调回主菜单");
                select=getchar();
                getchar();
        }

wp231957 发表于 2021-9-20 05:17:44

去验证一段错误的代码,无疑是浪费时间
即便你成功了也没有任何意义

人造人 发表于 2021-9-20 10:47:16

一个指针变量没有初始化,那么这个指针变量中存储的地址有 3 种情况
1. 这个指针变量中存储的是一个已经使用过的变量的地址
2. 这个指针变量中存储的是一个还没有使用过的变量的地址
3. 这个指针变量中存储的是一个无效的的地址,例如 0x00001234
如果是你的那个例子,情况 1,程序只要之后不再使用那个被 scanf 覆盖的变量,就不会有任何问题
情况 2 一般来说程序会停止运行,也有可能不会停止运行,如果覆盖进去的值正好是那个变量的取值范围,例如那个变量可以存储 1、2、3,那个变量已经默认初始化成了 3,但是 scanf 把那个变量覆盖成了 1,程序不会停止运行,但是得到的结果一定是不对的
情况 3 程序肯定会停止运行
页: [1]
查看完整版本: C语言输入字符串奇怪的BUG