You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++传递数组至函数仅输出首个单词的问题排查及字符串拆分任务指导

问题排查与代码修正指导

我来帮你一步步梳理代码里的问题,然后给出能实现需求的修正方案~

你的代码里的核心问题

  • 读取句子不完整:你用了fin >> array,这个操作在C++中会以空格作为默认分隔符,所以只会读取文件里的第一个单词,不会获取整句内容,这是程序只输出首个单词的直接原因。
  • 拆分单词的逻辑完全缺失sentence2word函数根本没做拆分操作,只是把传入的数组直接写入文件,完全没实现任务要求的“拆分每个单词”的功能。
  • 函数返回值不合理sentence2word返回char类型,但你返回的是array[100]——数组下标是从0到99的,这属于数组越界访问;而且这个返回值对你的程序没有任何实际作用,应该改成void类型。
  • 无效的暂停操作system("pause")写在了return 0;之后,程序执行到return就会结束,这行代码永远不会被执行,应该移到return之前。

修正后的完整代码

#include <iostream>
#include <fstream>
#include <cstring> // 用于strlen等字符串操作函数
using namespace std;

// 拆分句子并将每个单词写入文件的函数
void sentence2word(const char* sentence) {
    ofstream fout2("word.txt"); // 直接在构造时打开文件,默认覆盖原有内容
    if (!fout2) { // 检查文件是否成功打开
        cerr << "无法打开word.txt文件!" << endl;
        return;
    }

    int wordStart = 0; // 记录当前单词的起始下标
    int len = strlen(sentence); // 获取句子的长度

    for (int i = 0; i <= len; ++i) {
        // 遇到空格或者句子结束符时,提取当前单词
        if (sentence[i] == ' ' || sentence[i] == '\0') {
            // 跳过连续的空格(避免空单词写入)
            if (i > wordStart) {
                // 逐个字符写入当前单词
                for (int j = wordStart; j < i; ++j) {
                    fout2 << sentence[j];
                }
                fout2 << endl; // 每个单词占一行
            }
            wordStart = i + 1; // 更新下一个单词的起始位置
        }
    }

    fout2.close(); // 关闭文件流
}

int main() {
    ifstream fin("sentence.txt");
    if (!fin) { // 检查文件是否成功打开
        cerr << "无法打开sentence.txt文件!" << endl;
        system("pause");
        return 1;
    }

    char array[100];
    fin.getline(array, 100); // 读取整行句子(包含空格)
    fin.close(); // 关闭输入文件流

    sentence2word(array); // 调用拆分函数
    cout << "Output successful!" << endl;

    system("pause"); // 移到return之前,确保能执行
    return 0;
}

关键修正点说明

  1. 读取整句内容:用fin.getline(array, 100)替代fin >> array,这样可以读取包含空格的整行句子,直到换行符或者达到数组长度上限。
  2. 实现单词拆分逻辑
    • 遍历句子数组,用wordStart记录每个单词的起始位置;
    • 遇到空格或字符串结束符\0时,提取从wordStart到当前下标之间的字符作为一个单词;
    • 增加了连续空格的判断,避免写入空内容。
  3. 优化文件操作
    • 在函数里先检查文件是否成功打开,避免后续无效操作;
    • 每个单词写入后换行,符合“每个单词写入单独行”的需求。
  4. 修复函数定义:把sentence2word改成void类型,参数用const char*更规范(因为不需要修改传入的句子)。

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

火山引擎 最新活动