You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:31:02