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

CS50 Wordle TODO#7:函数外复用变量报错及概念困惑

CS50 Wordle50 作业(TODO#7)问题解决

问题梳理

在完成哈佛大学CS50 2023作业集2的Wordle50项目时,在TODO#7部分遇到以下问题:

  • 尝试在for循环外部复用score变量时提示未声明
  • 使用if (guess == choice)判断是否猜对时,出现“use of undeclared identifier 'guess'”错误
  • 无法理解如何在代码块/函数外部复用guess(用户猜测单词)和choice(目标单词)变量,只能把所有代码写在main函数中,反复观看函数相关视频仍未掌握概念,需要学习资源

错误原因分析

  1. 变量作用域问题:
    • guess是在for循环内部声明的(string guess = get_guess(wordsize);),属于块级局部变量,循环结束后该变量会被销毁,外部无法访问
    • score同样是循环内的局部变量,循环外自然无法引用
  2. 字符串比较错误:
    • C语言中==用于比较字符串的指针地址,而非字符串内容。即使两个字符串内容相同,存储地址可能不同,guess == choice会判断为假,正确做法是使用strcmp函数

修复方案

方案1:利用已有的won变量(最简单)

你代码中已经定义了bool won = false;,并且在循环内猜对时会设置won = true;并跳出循环,所以TODO#7部分直接用这个变量判断即可:

// Print the game's result // TODO #7
if (won)
{
    printf("You won!\n");
}
else
{
    printf("The word was: %s\n", choice);
}

方案2:保存最后一次的猜测(如需展示)

如果需要在循环外展示用户最后一次的猜测,把guess的声明移到for循环外面,变成main函数的局部变量:

// 在main函数中,for循环之前添加
string guess = NULL;

// 修改循环内的代码,去掉string声明
for (int i = 0; i < guesses; i++)
{
    guess = get_guess(wordsize); // 这里不再写string guess
    // ... 其他代码不变
}

// TODO#7部分可以这样写(注意用strcmp比较字符串)
if (won)
{
    printf("You won!\n");
}
else
{
    printf("Your last guess: %s\n", guess);
    printf("The word was: %s\n", choice);
}

变量作用域核心概念

  • 局部变量:在函数或代码块(比如for循环、if语句)内部声明的变量,只能在该范围内访问,超出范围后会被释放
  • 全局变量:在所有函数外部声明的变量,整个程序都可以访问,但不建议滥用(会增加代码耦合度)
  • 函数参数:通过参数传递可以让函数使用外部变量的值,通过指针还可以修改外部变量的内容

学习资源建议

  • 重新观看CS50课程中关于变量作用域和函数的章节,重点关注局部变量、全局变量的区别,以及参数传递的方式
  • 学习C语言基础中的作用域规则,理解块级作用域的概念,这是C语言的核心基础之一

内容的提问来源于stack exchange,提问作者Rochdi Hadfi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:17:49