用C++编写一个程序,读取一行字符串并统计其中每个单词的长度,然后输出每个单词及其对应的长度。
时间: 2024-09-27 20:17:04 浏览: 53
在C++中,你可以通过标准库函数`std::getline`来读取一行字符串,并使用`std::istringstream`将字符串分割成单词,接着遍历这些单词计算它们的长度。下面是一个简单的示例程序:
```cpp
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string input;
std::cout << "请输入一行字符串: ";
getline(std::cin, input); // 从标准输入读取一行
std::istringstream iss(input);
std::string word; // 存储当前单词
while (iss >> word) { // 分割单词到word
size_t length = word.length(); // 计算单词长度
std::cout << "单词 \"" << word << "\" 的长度是: " << length << "\n"; // 输出结果
}
return 0;
}
```
在这个程序中,我们首先获取用户输入的一行字符串,然后通过`istringstream`逐个提取出单词,并计算其长度。遇到空格或者其他分隔符时,`iss >> word`会停止读取。
相关问题
用c++编写一个程序读取一个字符串并统计其中每个单词的长度然后输出每个单词及其对应的长度。
在C++中,你可以使用`cin`从用户那里获取输入,`istringstream`将输入分割成单词,然后遍历这些单词计算它们的长度。下面是一个简单的示例程序:
```cpp
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string input;
std::cout << "请输入一个字符串: ";
getline(std::cin, input); // 使用getline读入一行,包括空格
std::istringstream iss(input);
std::string word;
while (iss >> word) { // 逐词分割
int length = word.length();
std::cout << "单词: " << word << ", 长度: " << length << std::endl;
}
return 0;
}
```
在这个程序中,我们首先提示用户输入一个字符串,然后通过`getline`函数一次读入一行文本,而不是遇到空格就停止。接下来,我们将这个输入流传递给`istringstream`,它会按空格分隔字符串。对于每一行中的每一个单词,我们都会计算其长度,并输出。
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。 输入格式: 输入在一行中给出一行文本,以.结束 提示:用scanf("%c",...);来读入一个字符,直到读到.为止。 输出格式: 在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。 输入样例:
### 回答1:
这个问题要求编写一个读取一行文本的程序,在其中用空格分隔为若干个单词,每个单词的长度为若干个字符,以.结束。你需要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式: 输入在一行中给出一行文本,以.结束。
输出格式: 在一行中按照输入的格式输出单词的长度,每个长度后面跟一个空格。行末不得有多余空格。
输入样例: This is a sample program that reads input.
输出样例:
4 2 1 6 7 5.
注意:实现输入时,请使用scanf("%c",...);来读入一个字符,直到读到。为止。
### 回答2:
本题考察的是字符串的扫描和处理技巧,在读入每一个字符时需要判断其是否为空格或者.,如果是则输出前一个单词的长度并将计数器清零,否则计数器加1。
具体实现时,可以用scanf("%c", &c)读入一个字符,同时用getchar()读掉多余的空格,直到遇到.为止。读入的字符依次存入一个字符数组中,然后扫描这个数组并统计长度即可。
具体代码如下:
```cpp
#include <stdio.h>
int main()
{
char c, s[1000];
int len = 0; // 单词长度计数器
// 读入文本,直到读到.
scanf("%c", &c);
while (c != '.') {
s[len++] = c;
scanf("%c", &c);
}
// 扫描字符串并输出每个单词的长度
for (int i = 0; i < len; i++) {
if (s[i] == ' ') {
printf("%d ", len - i - 1);
} else if (i == len - 1) {
printf("%d\n", len - i - 1);
}
}
return 0;
}
```
需要注意的细节有:
1. 在每次读入一个字符后,需要用getchar()读掉多余的空格,直到读到第一个非空格的字符。这是为了避免连续空格造成的额外计数。
2. 在输出最后一个单词长度时,需要用printf("%d\n", len - i - 1)输出换行符。
### 回答3:
本题需要读入一行文本,其中以空格分隔为若干个单词,以.结束。因此我们可以使用 scanf 来读入每个字符,并判断是否为 '.',如果是则结束读入。
读入的过程中,需要过滤连续的空格。如果遇到空格,则说明一个单词已经结束,可以输出它的长度并重新计数。如果遇到非空格字符,则将计数器加一。
最后需要注意的是,行末的 '.' 不计算在内,因此输出长度时要去掉它。可以使用一个布尔变量标记在读入到 '.' 后是否遇到过一个非空格字符,如果遇到了,则说明最后一个单词已经结束,可以直接输出它的长度。
完整代码如下:
```C++
#include <iostream>
using namespace std;
int main() {
int cnt = 0; // 当前单词长度计数器
bool last_non_blank = false; // 上一个字符是否为非空格字符的标记
char c; // 读入的字符
while (scanf("%c", &c) != EOF) { // 循环读入字符,直到遇到 EOF
if (c == '.') { // 如果读入到 '.',则结束读入
break;
} else if (c == ' ') { // 如果读入到空格
if (last_non_blank) { // 如果上一个字符是非空格字符,说明一个单词已经结束
cout << cnt << " "; // 输出单词长度
cnt = 0; // 重置计数器
last_non_blank = false; // 标记为已经遇到空格
}
} else { // 如果读入到非空格字符
cnt++; // 计数器加一
last_non_blank = true; // 标记为已经遇到非空格字符
}
}
if (last_non_blank) { // 最后一个单词还未输出(即遇到了最后一个非空格字符)
cout << cnt; // 直接输出最后一个单词的长度
}
return 0;
}
```
阅读全文