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

出现error: expected expression错误,如何修正do-while循环条件?

C语言error: expected expression错误分析与修复

错误原因拆解

你的代码存在多个问题,直接导致了error: expected expression以及其他潜在逻辑错误:

  1. 变量作用域问题:answer在do代码块内部声明,while条件所在的外部作用域无法访问该变量,且不能在while的条件表达式中重复声明变量。
  2. 运算符误用:使用赋值运算符=而非相等比较运算符==,完全违背了判断逻辑。
  3. 字符常量格式错误:y和n是字符常量,必须用单引号'y'、'n'包裹,否则编译器会将其视为未定义变量。
  4. get_char函数使用错误:CS50的get_char不支持格式化输出,不能像printf那样携带%s、%i这类占位符,需先通过printf输出信息,再调用get_char获取输入。

修正后的代码

#include <stdio.h>
#include <cs50.h>

int main (void)
{
    string name = get_string("What's your name? ");
    int age = get_int("What's your age? ");
    // 手机号建议用字符串存储:避免长度超出int范围、开头0被忽略的问题
    string phone = get_string("What's your phone number? ");
    
    char answer;
    do
    {
        // 先通过printf输出格式化信息
        printf("Are the information below correct? (y or n): \n Name: %s \n Age: %i \n Phone: %s\n", name, age, phone);
        // 单独调用get_char获取用户输入
        answer = get_char();
        // 清理输入缓冲区的换行符,避免后续读取异常
        while(getchar() != '\n');
    }
    // 循环条件:输入不是'y'也不是'n'时,重复询问
    while (answer != 'y' && answer != 'n');
    
    return 0;
}

额外说明

  • 手机号用int存储存在缺陷:常规手机号长度超过int类型的取值范围(4字节int最大值约20亿),且开头的0会被自动忽略,改用string存储更合理。
  • 调用get_char后清理缓冲区换行符是必要操作,否则下次读取输入时会直接读取到残留的换行符,导致逻辑异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:25:04