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

结构体字符串输入与比较异常:外国优秀学生占比计算排查

问题排查与修复方案

核心问题1:C风格字符串比较逻辑错误

你用s[i].country != u判断国籍是否为"Ukraine"是完全错误的。country和u都是字符数组名,本质是指向数组首元素的指针,这里比较的是两个指针的内存地址,而非字符串内容。

正确做法是使用C标准库的strcmp函数:

strcmp(a, b)返回0时,表示两个字符串完全相等;返回非0值则表示不等。

修改判断条件为:

strcmp(s[i].country, u) != 0 && s[i].meanMark > 3

同时需要添加头文件#include <cstring>,否则strcmp无法被编译器识别。

核心问题2:整数除法导致计算误差

代码中k / 4 * 100是整数除法运算,因为k和4都是int类型。比如当k=1时,1/4的结果是0,再乘以100还是0,和预期的25%完全不符。

需要将其中一个操作数转为浮点数,强制触发浮点除法:

float percent = static_cast<float>(k) / 4 * 100;

修复后的完整代码

#include <iostream>
#include <ctime>
#include <Windows.h>
#include <cmath>
#include <iomanip>
#include <cstring> // 新增头文件
using namespace std;

struct Student {
    char country[15];
    int course;
    float meanMark;
};
int main() {
    Student s[4];
    for (int i = 0; i < 4; i++) {
        cout << "Student" << i + 1 << ": " << "\n";
        cin >> s[i].country;
        cin >> s[i].course;
        cin >> s[i].meanMark;
    }
    char u[8] = "Ukraine";
    int k = 0;
    for (int i = 0; i < 4; i++) {
        if (strcmp(s[i].country, u) != 0 && s[i].meanMark > 3) {
            k++;
        }
    }
    float percent = static_cast<float>(k) / 4 * 100;
    cout << "percent = " << percent << "%" << endl;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:25:48