C语言CTF挑战中if-else语句判断逻辑失效问题求助
问题分析与修复方案
嘿,我一眼就揪出你代码里的问题啦!核心错误出在字符串比较的方式上——在C语言里,你可不能直接用==来判断两个字符串的内容是否相等哦。
为什么if (flagText == phrase)永远不成立?
flagText和phrase是两个独立的字符数组,它们在内存里占据着不同的地址空间。==运算符在这里比较的是两个数组的内存地址,而不是它们存储的实际内容。哪怕两个字符串的字符完全一致,它们的内存地址也是不同的,所以这个判断条件永远会走else分支,这就是你看到的奇怪现象的原因。
修复步骤
用标准库的字符串比较函数
strcmp()
C标准库的<string.h>头文件里提供了strcmp()函数,专门用来比较字符串内容:- 返回
0表示两个字符串完全相等 - 返回负数表示前者的字典序小于后者
- 返回正数表示前者的字典序大于后者
所以首先要在代码顶部新增<string.h>头文件的引用。
- 返回
处理
fgets()读取的换行符
还有个容易忽略的小细节:fgets()会把文本文件里的换行符\n也读进flagText里,但你的phrase变量里没有这个换行符。如果flag.txt的内容末尾带有换行,哪怕核心内容一致,比较还是会失败。可以用strcspn()函数快速去掉换行符。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> // 新增头文件,用于字符串操作 int main() { FILE *flag; flag = fopen("flag.txt", "r"); if (flag == NULL) { puts("Error: Opening file: Maybe you are in the wrong Zm9sZGVyIG9yIGRpcmVjdG9yeSAtIHRoZXJlIGFyZSAyMCBhZnRlciBhbGwh ?"); return 1; } char flagText[100]; fgets(flagText, 100, flag); // 去掉fgets读取到的换行符,让比较更准确 flagText[strcspn(flagText, "\n")] = '\0'; fclose(flag); char phrase[100] = "flag{alm0st_th3r3}"; // 使用strcmp比较字符串内容,返回0表示相等 if (strcmp(flagText, phrase) == 0 ) { printf("9mLf%BkqX6@:Cp5FC/!%D)5O@Dbkc"); return 0; } else { printf("Sorry - wrong!!"); return 1; } }
额外提醒
- 以后在C语言里处理字符串比较,一定要记得用
strcmp()(或者更安全的strncmp(),可以指定比较的最大长度),绝对不能直接用==。 - 如果你的
flag.txt文件末尾本来就没有换行符,那去掉换行的步骤可以省略,但加上它能让代码更健壮,适配不同的文件格式。
内容的提问来源于stack exchange,提问作者Kartibok
相关产品推荐
相关产品推荐

