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函数中,反复观看函数相关视频仍未掌握概念,需要学习资源
错误原因分析
- 变量作用域问题:
guess是在for循环内部声明的(string guess = get_guess(wordsize);),属于块级局部变量,循环结束后该变量会被销毁,外部无法访问score同样是循环内的局部变量,循环外自然无法引用
- 字符串比较错误:
- C语言中
==用于比较字符串的指针地址,而非字符串内容。即使两个字符串内容相同,存储地址可能不同,guess == choice会判断为假,正确做法是使用strcmp函数
- C语言中
修复方案
方案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
相关产品推荐
相关产品推荐

