1.题目描述
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度。
注意:如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。
2.输入格式
一行单词序列,最少1个单词,最多 300 个单词,单词之间用至少1个空格间隔。单词序列总长度不超过1000.
3.输出格式
依次输出对应单词的长度,之间以逗号间隔。
4.输入输出样例
1.输入
She was born in 1990-01-02 and from Beijing city.
2.输出
3,3,4,2,10,3,4,7,5
5.代码:
#include <stdio.h>
#include <string.h>
int main() {
char input[1001];
// 使用fgets安全读取输入
if (fgets(input, sizeof(input), stdin) != NULL) {
int len = strlen(input);
int i, word_len = 0;
for (i = 0; i < len; i++) {
// 检查是否是字母或数字,或者其他标点符号(包括-和.等)
if ((input[i] != ' ' && input[i] != '\n' && input[i] != '\r')) {
word_len++; // 统计当前单词的长度
} else if (word_len > 0) {
// 当遇到空格且当前单词长度大于0时,输出单词长度
printf("%d", word_len);
if (i < len - 1) {
printf(","); // 在输出后面加逗号,除非是最后一个单词
}
word_len = 0; // 重置单词长度计数器
}
}
// 如果最后有一个单词没有被处理
if (word_len > 0) {
printf("%d", word_len);
}
}
return 0;
}
6.注意点:
在C语言中,gets()
函数已经被废弃,不推荐在实际代码中使用。这是因为gets()
函数存在安全漏洞,可能导致缓冲区溢出。取而代之的是使用fgets()
函数来代替gets()
函数。
fgets()
函数从指定的流中读取一行,并把它存储在字符串指针所指向的字符数组中。fgets()
函数的原型如下:
char *fgets(char *str, int size, FILE *stream);
1.str
:指向一个字符数组的指针。
2.size
:要读取的字符数。
3.stream
:指向FILE
对象的指针,指示要从中读取的文件流。通常传入stdin
表示标准输入流。
使用fgets()
函数可以确保从输入中读取行,并将其存储到指定的字符数组中,从而防止缓冲区溢出。
以下是一个简单示例,演示如何使用fgets()
函数来代替gets()
函数:
#include <stdio.h>
int main() {
char str[100]; // 分配足够大的缓冲区来存储输入行
printf("请输入字符串:\n");
fgets(str, sizeof(str), stdin); // 从标准输入流中读取一行
printf("你输入的字符串是: %s", str);
return 0;
}