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,根据标准,您可以通过包含&lt;string&gt; 来访问它。期间。 我还没有找到一个不包括字符串的 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 ++我不知道如何在字符串(句子)中找到一个单词(例如香蕉,三明治)用户输入句子然后写出那个单词的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中正确存储结构

如何检查句子是不是包含特定单词?

如何在R语言中查找具有连续字母的字符串中的单词

如何在正则表达式中匹配多个单词

如何在二维字符数组中找到相同字符的菱形?

如何确定在 SwiftUI 中的多词文本视图中点击的词