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

求指导:实现读取字符串至EOF并输出最长单词及长度(禁用strlen)

别担心,刚上手写程序遇到卡壳太正常啦!我来一步步帮你搞定这个需求,同时满足所有要求~

首先先修正框架里的一个小问题:你定义了两个同名的longest变量(一个是int类型,一个是char数组),这在C里是不允许的,我们把记录最长单词长度的变量改成longest_len,这样就不会冲突了。

完整实现代码

#include <stdio.h>

static const int max_word_len = 50;

// 必须使用的copy函数:将src的前count个字符复制到dst,自动添加字符串结束符
void copy(char src[], char dst[], int count) {
    int j;
    for(j = 0; j < count; j++) {
        dst[j] = src[j];
    }
    dst[j] = '\0'; // 字符串必须以'\0'结尾,否则输出会乱码
}

int main(int argc, const char *argv[]){
    int c = 0;
    int i = 0;
    int longest_len = 0; // 记录最长单词的长度
    int current_len = 0; // 记录当前单词的长度
    char current[max_word_len]; // 存储当前正在读取的单词
    char longest[max_word_len]; // 存储最长的单词
    longest[0] = '\0'; // 初始化最长单词为空字符串,避免垃圾值

    // 读取字符直到EOF,同时保证当前单词不超过最大长度-1(留位置给'\0')
    while((c = getchar()) != EOF && i < max_word_len - 1) {
        // 判断当前字符是否是单词字符(这里定义非空白符为单词字符,可根据需求调整)
        if(c != ' ' && c != '\n' && c != '\t') {
            current[i] = c;
            i++;
            current_len++;
        } else {
            // 遇到空白符,说明当前单词结束,开始比较
            if(current_len > longest_len) {
                longest_len = current_len;
                copy(current, longest, current_len);
            }
            // 重置当前单词的状态,准备读取下一个单词
            current_len = 0;
            i = 0;
        }
    }

    // 处理最后一个单词(可能直接读到EOF,没遇到空白符)
    if(current_len > longest_len) {
        longest_len = current_len;
        copy(current, longest, current_len);
    }

    // 输出结果
    if(longest_len == 0) {
        printf("没有有效的单词输入哦\n");
    } else {
        printf("最长单词是:%s,长度是:%d\n", longest, longest_len);
    }

    return 0;
}

关键逻辑讲解

  1. copy函数实现:

    • 这个函数负责把当前单词的内容复制到存储最长单词的数组里,必须手动添加'\0',因为C语言的字符串需要这个结束标记才能被正确识别。
  2. 字符读取与单词判断:

    • 用getchar()逐个读取输入字符,直到遇到EOF(你可以在终端用Ctrl+D(Linux/Mac)或Ctrl+Z(Windows)触发EOF)。
    • 我们把空格、换行、制表符视为单词分隔符,遇到这些字符就认为当前单词结束。
  3. 长度比较与更新:

    • 我们用current_len手动记录当前单词的长度(完全不用strlen(),符合要求)。
    • 每次单词结束时,比较当前长度和最长长度,如果更长,就更新最长长度,并调用copy函数保存这个单词。
  4. 边界情况处理:

    • 处理了输入直接到EOF的情况(比如最后一个单词后面没有空白符)。
    • 处理了没有有效单词的情况(比如输入全是空白符)。
    • 限制了单词长度不超过max_word_len-1,避免数组越界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:07:29