C ++我不知道如何在字符串句子中找到一个词例如香蕉,三明治用户输入句子然后写出那个词

问题描述

我已经尝试过这个,但老实说我被卡住了。
我正在尝试找到第一个字符,然后搜索该子字符串的结尾(例如,如果单词是“三明治”并且它找到了 '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;
}

解决方法

请求有点模糊,但考虑到您发布的代码,我想我知道您打算做什么。

最简单的(但不一定是性能最好的)是使用字符串流,更准确地说是 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 ;
}

只是一些提示:

  1. iostream 已经包含字符串,不需要重新包含它。 [编辑](正如 whozcraig 所指出的,这不符合标准。无论如何,守卫都会“否定”双重包含,所以是的,包括字符串不是错误。如评论中所指定,我是尚未找到不包含字符串的 iostream 实现)[/Edit]

  2. 最好不要调用变量“s”或“a”:使用名称 这使它易于识别。

,

您可以使用 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',而不是 '!'