鱼C论坛

 找回密码
 立即注册
查看: 2595|回复: 16

[已解决]在s2中输入,使得输出为congratulate。求大佬解释为什么0.0

[复制链接]
发表于 2022-10-19 10:52:07 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
#include<string.h>
int main()
{
char s1[50] = "hahaha";
char s2[50] = "         "; //example:char s2[50] = "abcdef";
char s3[2] = "h";
int i,a,b;
for(i = 0;i < strlen(s2);i++)
{
a = s2[i];
b = s3[0];
if(a == b)
return printf("Sorry");                        
}
if(!strncmp(s2,s1,i))                        
printf("Congradulate!");
else
printf("Sorry\n");
return 0;
}
最佳答案
2022-10-19 11:14:45
本帖最后由 jackz007 于 2022-10-19 11:34 编辑

        本例 12 行要求 s2 中不允许有 'h' 字符,而 13 行又要从头开始逐长度比较 s1 和 s2,两个条件看似冲突,其实不然,还是有空子可钻的。
        s2 随便写,只要第一个字符不是 'h' 就可以看到 "Congradulate!",其中的原因是,第 1 个字符不是 'h' 可以过第 12 行的检查,第 13 行的字符串比较会因为 i = 0 (长度为 0)而得到函数值 0,于是,就可以看到 "Congradulate!",至于第 2 个字符及以后,那是要实质性从头比较 s1 和 s2 的,s2 又不允许出现 'h',所以,肯定都不一样,会看到很多的 "Sorry",所以,s2 第 2 个字符安排成字符 'h',可以尽早结束这一切。
#include<stdio.h>
#include<string.h>
int main(void)
{
        char s1[50] = "hahaha"                                       ;
        char s2[50] = "1h2345678"                                    ; //example:char s2[50] = "abcdef";
        char s3[2]  = "h"                                            ;
        int i , a , b                                                ;
        for(i = 0 ; i < strlen(s2) ; i ++) { 
                a = s2[i]                                            ;
                b = s3[0]                                            ;
                if(a == b) return printf("Sorry\n")                  ; // 此句要求 s2 中不可以出现字符 s3[0] 也就是 'h'                       
                if(! strncmp(s2 , s1 , i)) printf("Congradulate!\n") ; // 此句从头开始比较 s1 和 s2 中的 i 个字符,如果完全相同则打印 "Congradulate!"
                else printf("Sorry\n")                               ;
        }
        return 0;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
Congradulate!
Sorry

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-19 11:14:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-19 11:34 编辑

        本例 12 行要求 s2 中不允许有 'h' 字符,而 13 行又要从头开始逐长度比较 s1 和 s2,两个条件看似冲突,其实不然,还是有空子可钻的。
        s2 随便写,只要第一个字符不是 'h' 就可以看到 "Congradulate!",其中的原因是,第 1 个字符不是 'h' 可以过第 12 行的检查,第 13 行的字符串比较会因为 i = 0 (长度为 0)而得到函数值 0,于是,就可以看到 "Congradulate!",至于第 2 个字符及以后,那是要实质性从头比较 s1 和 s2 的,s2 又不允许出现 'h',所以,肯定都不一样,会看到很多的 "Sorry",所以,s2 第 2 个字符安排成字符 'h',可以尽早结束这一切。
#include<stdio.h>
#include<string.h>
int main(void)
{
        char s1[50] = "hahaha"                                       ;
        char s2[50] = "1h2345678"                                    ; //example:char s2[50] = "abcdef";
        char s3[2]  = "h"                                            ;
        int i , a , b                                                ;
        for(i = 0 ; i < strlen(s2) ; i ++) { 
                a = s2[i]                                            ;
                b = s3[0]                                            ;
                if(a == b) return printf("Sorry\n")                  ; // 此句要求 s2 中不可以出现字符 s3[0] 也就是 'h'                       
                if(! strncmp(s2 , s1 , i)) printf("Congradulate!\n") ; // 此句从头开始比较 s1 和 s2 中的 i 个字符,如果完全相同则打印 "Congradulate!"
                else printf("Sorry\n")                               ;
        }
        return 0;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
Congradulate!
Sorry

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 11:22:40 | 显示全部楼层
jackz007 发表于 2022-10-19 11:14
此代码12、13两行的代码逻辑完全冲突,所以,无论怎么填写 s2 的内容,都将无法看到 "Congradulate ...

对的,我在想能不能用其他的表示方法输出h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 11:23:52 | 显示全部楼层
jackz007 发表于 2022-10-19 11:14
此代码12、13两行的代码逻辑完全冲突,所以,无论怎么填写 s2 的内容,都将无法看到 "Congradulate ...

不知道能不能用asc码来输入h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 11:28:09 | 显示全部楼层
梦有所依丶 发表于 2022-10-19 11:23
不知道能不能用asc码来输入h

        有出路的,再看看 2 楼的解释。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 11:33:38 | 显示全部楼层
jackz007 发表于 2022-10-19 11:14
本例 12 行要求 s2 中不允许有 'h' 字符,而 13 行又要从头开始逐长度比较 s1 和 s2,两个条件看似 ...

还是出不来,而且13行不在循环里啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 11:37:02 | 显示全部楼层
梦有所依丶 发表于 2022-10-19 11:33
还是出不来,而且13行不在循环里啊


        看 2 楼我整理过的代码,第 9 ~ 15 行都在循环以内,你实际编译、运行一下 2 楼的代码再说。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 11:37:47 | 显示全部楼层
jackz007 发表于 2022-10-19 11:14
本例 12 行要求 s2 中不允许有 'h' 字符,而 13 行又要从头开始逐长度比较 s1 和 s2,两个条件看似 ...

题目要求可以修改s2,这样的话是不是就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 11:39:16 | 显示全部楼层
梦有所依丶 发表于 2022-10-19 11:37
题目要求可以修改s2,这样的话是不是就可以了


       别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 11:43:40 | 显示全部楼层
jackz007 发表于 2022-10-19 11:39
别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内 ...

原话是在源码中修改s2,使得输出congratulate
刚刚看错了,对不起0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 11:44:10 | 显示全部楼层
jackz007 发表于 2022-10-19 11:39
别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内 ...

所以修改s2怎么才能运行出呢..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 11:58:10 | 显示全部楼层
梦有所依丶 发表于 2022-10-19 11:44
所以修改s2怎么才能运行出呢..

         还要怎么说,2 楼的代码呀,你就不能实际运行一下???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 12:38:47 | 显示全部楼层
jackz007 发表于 2022-10-19 11:58
还要怎么说,2 楼的代码呀,你就不能实际运行一下???

#include<stdio.h>
#include<string.h>
int main()
{
char s1[50] = "hahaha";
char s2[1] = "";                               //example:char s2[50] = "abcdef";
char s3[2] = "h";
int i,a,b;
for(i = 0;i < strlen(s2);i++)
{
a = s2[i];
b = s3[0];
if(a == b)
return printf("Sorry");                        /*不能有h*/
}
if(!strncmp(s2,s1,i))                         /*让s2s1相等就可以输出congratulate*/
printf("Congradulate!");
else
printf("Sorry\n");
return 0;
}
/*直接让s2元素只有一个,这样的话i就只能为0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-19 12:39:24 | 显示全部楼层
jackz007 发表于 2022-10-19 11:58
还要怎么说,2 楼的代码呀,你就不能实际运行一下???

不让改括号0.0,这样的话可以运行了0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 12:41:24 | 显示全部楼层
梦有所依丶 发表于 2022-10-19 12:39
不让改括号0.0,这样的话可以运行了0.0

        大哥,和你交流实在太累,你看看,你的楼都多高了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-20 19:20:20 | 显示全部楼层
jackz007 发表于 2022-10-19 12:41
大哥,和你交流实在太累,你看看,你的楼都多高了???

发现了一个事情,“”里面啥也不输也能成功。
请问下a[50] = ""  这个语句是不是定义了个空数组?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-20 19:21:35 | 显示全部楼层
梦有所依丶 发表于 2022-10-20 19:20
发现了一个事情,“”里面啥也不输也能成功。
请问下a[50] = ""  这个语句是不是定义了个空数组?

          是的,定义空数组应该是唯一正确的答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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