为什么输入pass1后这段C代码中的if结构仍未运行?
问题根因
在C语言中,==运算符直接作用于字符数组/字符串指针时,比较的是两个变量指向的内存地址,而非字符串实际存储的内容。
你代码中pass是栈内存上的字符数组首地址,宏ab对应的是只读数据段中字符串常量"pass1"的首地址,二者地址永远不相等,因此if判断永远为假,分支不会执行。
修复方案
- 将if判断中的
pass == ab替换为strcmp(pass, ab) == 0。strcmp是<string.h>头文件提供的字符串比较函数,当两个字符串内容完全匹配时返回值为0。 - 替换不安全的
gets()函数:该函数不校验输入长度,存在缓冲区溢出风险,建议使用fgets()替代。如果使用fgets需要注意其会将输入末尾的换行符也存入数组,匹配前需要手动去除。
修复后完整代码
#include <stdio.h> #include <string.h> #define ab "pass1" int main() { char pass[8]; char str[8]; printf("Enter a string :"); // 替换gets为fgets避免缓冲区溢出 fgets(str, sizeof(str), stdin); // 去除fgets读入的末尾换行符 str[strcspn(str, "\n")] = '\0'; strcpy(pass, str); printf("your string is %s ", str); // 用strcmp比较字符串内容 if (strcmp(pass, ab) == 0) { printf("la swagat cha!"); } return 0; }
内容的提问来源于stack exchange,提问作者Abhishek Bhattarai
相关产品推荐
相关产品推荐

