梦有所依丶 发表于 2022-10-19 10:52:07

在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: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 = "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>

梦有所依丶 发表于 2022-10-19 11:22:40

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

对的,我在想能不能用其他的表示方法输出h

梦有所依丶 发表于 2022-10-19 11:23:52

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

不知道能不能用asc码来输入h

jackz007 发表于 2022-10-19 11:28:09

梦有所依丶 发表于 2022-10-19 11:23
不知道能不能用asc码来输入h

      有出路的,再看看 2 楼的解释。

梦有所依丶 发表于 2022-10-19 11:33:38

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

还是出不来,而且13行不在循环里啊

jackz007 发表于 2022-10-19 11:37:02

梦有所依丶 发表于 2022-10-19 11:33
还是出不来,而且13行不在循环里啊

      看 2 楼我整理过的代码,第 9 ~ 15 行都在循环以内,你实际编译、运行一下 2 楼的代码再说。

梦有所依丶 发表于 2022-10-19 11:37:47

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

题目要求可以修改s2,这样的话是不是就可以了

jackz007 发表于 2022-10-19 11:39:16

梦有所依丶 发表于 2022-10-19 11:37
题目要求可以修改s2,这样的话是不是就可以了

       别人就是专门设的局,让你从看似不可能有的空子中间给钻过去,不用怀疑,就是让你填写 s2 的内容。

梦有所依丶 发表于 2022-10-19 11:43:40

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

原话是在源码中修改s2,使得输出congratulate
刚刚看错了,对不起0.0

梦有所依丶 发表于 2022-10-19 11:44:10

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

所以修改s2怎么才能运行出呢..

jackz007 发表于 2022-10-19 11:58:10

梦有所依丶 发表于 2022-10-19 11:44
所以修改s2怎么才能运行出呢..

         还要怎么说,2 楼的代码呀,你就不能实际运行一下???

梦有所依丶 发表于 2022-10-19 12:38:47

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

梦有所依丶 发表于 2022-10-19 12:39:24

jackz007 发表于 2022-10-19 11:58
还要怎么说,2 楼的代码呀,你就不能实际运行一下???

不让改括号0.0,这样的话可以运行了0.0

jackz007 发表于 2022-10-19 12:41:24

梦有所依丶 发表于 2022-10-19 12:39
不让改括号0.0,这样的话可以运行了0.0

      大哥,和你交流实在太累,你看看,你的楼都多高了???

梦有所依丶 发表于 2022-10-20 19:20:20

jackz007 发表于 2022-10-19 12:41
大哥,和你交流实在太累,你看看,你的楼都多高了???

发现了一个事情,“”里面啥也不输也能成功。
请问下a = ""这个语句是不是定义了个空数组?

jackz007 发表于 2022-10-20 19:21:35

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

          是的,定义空数组应该是唯一正确的答案!
页: [1]
查看完整版本: 在s2中输入,使得输出为congratulate。求大佬解释为什么0.0