求指导:实现读取字符串至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; }
关键逻辑讲解
copy函数实现:
- 这个函数负责把当前单词的内容复制到存储最长单词的数组里,必须手动添加
'\0',因为C语言的字符串需要这个结束标记才能被正确识别。
- 这个函数负责把当前单词的内容复制到存储最长单词的数组里,必须手动添加
字符读取与单词判断:
- 用
getchar()逐个读取输入字符,直到遇到EOF(你可以在终端用Ctrl+D(Linux/Mac)或Ctrl+Z(Windows)触发EOF)。 - 我们把空格、换行、制表符视为单词分隔符,遇到这些字符就认为当前单词结束。
- 用
长度比较与更新:
- 我们用
current_len手动记录当前单词的长度(完全不用strlen(),符合要求)。 - 每次单词结束时,比较当前长度和最长长度,如果更长,就更新最长长度,并调用
copy函数保存这个单词。
- 我们用
边界情况处理:
- 处理了输入直接到EOF的情况(比如最后一个单词后面没有空白符)。
- 处理了没有有效单词的情况(比如输入全是空白符)。
- 限制了单词长度不超过
max_word_len-1,避免数组越界。
内容的提问来源于stack exchange,提问作者wannabeprogrammer
相关产品推荐
相关产品推荐

