在s2中输入,使得输出为congratulate。求大佬解释为什么0.0
#include<stdio.h>#include<string.h>
int main()
{
char s1 = "hahaha";
char s2 = " "; //example:char s2 = "abcdef";
char s3 = "h";
int i,a,b;
for(i = 0;i < strlen(s2);i++)
{
a = s2;
b = s3;
if(a == b)
return printf("Sorry");
}
if(!strncmp(s2,s1,i))
printf("Congradulate!");
else
printf("Sorry\n");
return 0;
} 本帖最后由 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 = "hahaha" ;
char s2 = "1h2345678" ; //example:char s2 = "abcdef";
char s3= "h" ;
int i , a , b ;
for(i = 0 ; i < strlen(s2) ; i ++) {
a = s2 ;
b = s3 ;
if(a == b) return printf("Sorry\n") ; // 此句要求 s2 中不可以出现字符 s3 也就是 'h'
if(! strncmp(s2 , s1 , i)) printf("Congradulate!\n") ; // 此句从头开始比较 s1 和 s2 中的 i 个字符,如果完全相同则打印 "Congradulate!"
else printf("Sorry\n") ;
}
return 0;
}
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
Congradulate!
Sorry
D:\\C> jackz007 发表于 2022-10-19 11:14
此代码12、13两行的代码逻辑完全冲突,所以,无论怎么填写 s2 的内容,都将无法看到 "Congradulate ...
对的,我在想能不能用其他的表示方法输出h
jackz007 发表于 2022-10-19 11:14
此代码12、13两行的代码逻辑完全冲突,所以,无论怎么填写 s2 的内容,都将无法看到 "Congradulate ...
不知道能不能用asc码来输入h
梦有所依丶 发表于 2022-10-19 11:23
不知道能不能用asc码来输入h
有出路的,再看看 2 楼的解释。 jackz007 发表于 2022-10-19 11:14
本例 12 行要求 s2 中不允许有 'h' 字符,而 13 行又要从头开始逐长度比较 s1 和 s2,两个条件看似 ...
还是出不来,而且13行不在循环里啊
梦有所依丶 发表于 2022-10-19 11:33
还是出不来,而且13行不在循环里啊
看 2 楼我整理过的代码,第 9 ~ 15 行都在循环以内,你实际编译、运行一下 2 楼的代码再说。 jackz007 发表于 2022-10-19 11:14
本例 12 行要求 s2 中不允许有 'h' 字符,而 13 行又要从头开始逐长度比较 s1 和 s2,两个条件看似 ...
题目要求可以修改s2,这样的话是不是就可以了
梦有所依丶 发表于 2022-10-19 11:37
题目要求可以修改s2,这样的话是不是就可以了
别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内容。 jackz007 发表于 2022-10-19 11:39
别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内 ...
原话是在源码中修改s2,使得输出congratulate
刚刚看错了,对不起0.0 jackz007 发表于 2022-10-19 11:39
别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内 ...
所以修改s2怎么才能运行出呢.. 梦有所依丶 发表于 2022-10-19 11:44
所以修改s2怎么才能运行出呢..
还要怎么说,2 楼的代码呀,你就不能实际运行一下??? jackz007 发表于 2022-10-19 11:58
还要怎么说,2 楼的代码呀,你就不能实际运行一下???
#include<stdio.h>
#include<string.h>
int main()
{
char s1 = "hahaha";
char s2 = ""; //example:char s2 = "abcdef";
char s3 = "h";
int i,a,b;
for(i = 0;i < strlen(s2);i++)
{
a = s2;
b = s3;
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 jackz007 发表于 2022-10-19 11:58
还要怎么说,2 楼的代码呀,你就不能实际运行一下???
不让改括号0.0,这样的话可以运行了0.0 梦有所依丶 发表于 2022-10-19 12:39
不让改括号0.0,这样的话可以运行了0.0
大哥,和你交流实在太累,你看看,你的楼都多高了??? jackz007 发表于 2022-10-19 12:41
大哥,和你交流实在太累,你看看,你的楼都多高了???
发现了一个事情,“”里面啥也不输也能成功。
请问下a = ""这个语句是不是定义了个空数组? 梦有所依丶 发表于 2022-10-20 19:20
发现了一个事情,“”里面啥也不输也能成功。
请问下a = ""这个语句是不是定义了个空数组?
是的,定义空数组应该是唯一正确的答案!
页:
[1]