C ++我不知道如何在字符串(句子)中找到一个单词(例如香蕉,三明治)用户输入句子然后写出那个单词
Posted
技术标签:
【中文标题】C ++我不知道如何在字符串(句子)中找到一个单词(例如香蕉,三明治)用户输入句子然后写出那个单词【英文标题】:C++ I don't know how to find a word(eg.banana,sandwich) inside of a string(sentence) THE USER ENTERS the sentence and then write that word out 【发布时间】:2021-02-12 11:45:45 【问题描述】:我已经尝试过了,但老实说我被卡住了。 我试图找到第一个字符,然后搜索该子字符串的结尾(例如,如果这个词是“三明治”并且它发现“s”它认为它是“三明治”)然后写出三明治这个词。而且我也是 C++ 新手。
#include<iostream>
#include<string>
using namespace std;
int main()
string s, word;
char a;
cout << "Enter the sentence that you desire: ";
getline(cin, s);
cout << "Enter the letter that you want: ";
cin >> a;
for (int i = 0; i < s.length; i++)
if (s[i] == a)
if (s[i] == '\0')
word = s;
cout << word;
return 0;
【问题讨论】:
如果s[i]
等于a
它不能同时等于'\0'
(除非a == '\0'
)
换句话说,您想找到一个单词的开头(字符串开头的字母或空格或标点符号之后的字母)。如果它的第一个字符匹配,则将其打印到单词的结尾(字符串、空格或标点符号的最近结尾)。否则跳到单词的下一个开头。
我想你首先要弄清楚你认为哪些字符是单词字符。例如,'a'、'-' 等组成一个单词,但任何类似 '.'或者空间没有。
@largest_prime_is_463035818 先生,您是对的,但我真的卡住了,不知道如何写出代码
@bitmask 它需要是一个词,如sandwitch、apple、bannana 等。
【参考方案1】:
请求有点模糊,但考虑到您发布的代码,我想我知道您打算做什么。
最简单(但不一定是性能最好的)是使用字符串流,更准确地说是istringstream。 你基本上是用一个字符串(你从键盘传递的那个)构建它,然后你就像它是你的 cin 一样使用它(它作为一个规范化的 istream)。
此时您可以迭代句子的每个单词并检查第一个字母。 字符串的第一个字符是 myString[0] 或 myString.front()。这取决于你。
代码应如下所示:
#include <iostream> //cin/cout
#include <sstream> //istringstream
using namespace std ;
int main()
//first of all let's get our sentence AND the character you want
cout << "insert sentence here: " ;
string sentence ;
getline(cin, sentence) ;
cout << "insert the character here: " ;
char letter ;
cin >> letter ;
//then let's create an istringstream with said sentence
istringstream sentenceStream(sentence) ;
//let's then iterate over each word
string word ;
while(sentenceStream >> word)
//and see if the word starts with the letter we passed by keyboard
if(word.front() == letter)
cout << "the word \"" << word << "\" starts with '" << letter << "'\n" ;
return 0 ;
只是一些提示:
iostream 已经包含字符串,不需要重新包含它。 [编辑](正如whozcraig 所指出的那样,这不符合标准。守卫无论如何都会“否定”双重包含,所以是的,包括字符串不是错误。如评论中所述,我还没有找到一个不包含字符串的iostream实现)[/Edit]
最好不要调用变量“s”或“a”:使用名称 这使它易于识别。
【讨论】:
(1.) 完全不受标准的保证。如果您使用std::string
,根据标准,您可以通过包含<string>
来访问它。期间。
我还没有找到一个不包括字符串的 iostream 实例。但你在形式上是正确的。
非常感谢您的提示,您已经解决了我的问题! @FRANCESCOAVANZI【参考方案2】:
你可以用std::find_if
找到单词的结尾:
#include <algorithm>
#include <string>
template <typename Is>
std::string find_word(Is& stream, char needle)
auto const nonword = [](char c)
if ('a' <= c && c <= 'z') return false;
if ('A' <= c && c <= 'Z') return false;
if (c == '-') return false;
return true;
;
for (std::string w; stream >> w;)
if (w.size() && w[0] == needle)
auto const last = std::find_if(std::begin(w),std::end(w),nonword);
return std::string(std::begin(w),last);
return "";
这将任何流作为参数,包括std::cin
,并且可以像这样调用:
std::cout << find_word(std::cin,'w') << "\n";
重要的是要专门找到流传递给您的每个块中的最后一个字符,因为默认情况下流只会沿空白剪切。所以如果你输入一个句子:
Hello world!
您希望单词的结尾是'd'
,而不是'!'
。
【讨论】:
以上是关于C ++我不知道如何在字符串(句子)中找到一个单词(例如香蕉,三明治)用户输入句子然后写出那个单词的主要内容,如果未能解决你的问题,请参考以下文章