本帖最后由 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>
|