C语言CS50x练习中同内容字符串为何用==判定不等
问题描述
我目前正在学习CS50x课程,调试第一周配套练习题、探索自身知识掌握边界时遇到问题:为什么内容同为"October"的my_month和your_month两个字符串用==判断不相等?
测试时打印my_month的输出结果确实是"October",但当我为your_month输入"October"时,程序并不认为它和数组内的对应字符串等价,相关代码如下:
string month [] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; string my_month = month [9]; string your_month = get_string("What month were you born? "); if (your_month == my_month) { printf("%s\n", your_month); }
问题原因
- CS50定义的
string类型本质是char*,也就是指向字符串首字符的内存指针,不是独立的字符串值类型。 - 用
==比较两个string变量时,比较的是两个指针存储的内存地址,不是指针指向的字符串文本内容。 my_month指向的是程序编译阶段就存放在静态常量区的"October"的固定内存地址;your_month是get_string函数运行时在堆区动态申请内存,把用户输入的内容逐字符写入后返回的指针,两个指针指向的内存位置完全不同,所以==判断结果永远为假。
修复方式
不要用==直接比较字符串内容,使用字符串比较函数strcmp判断两个字符串的内容是否一致即可。CS50环境已经内置该函数,原生C环境需要先引入<string.h>头文件。
修改后的判断逻辑:
// strcmp两个参数传入要比较的字符串,返回值为0时代表两个字符串内容完全相等 if (strcmp(your_month, my_month) == 0) { printf("%s\n", your_month); }
注意:
strcmp会逐位对比两个字符串的每个字符,直到遇到字符串结束符\0,只有所有字符完全一致时才会返回0,这才是判断字符串内容相等的正确方式。
内容的提问来源于stack exchange,提问作者mr_jay
相关产品推荐
相关产品推荐

