用C++程序提取两个句子,找出常见的字母

C++ program to take 2 sentences and find common letters?

本文关键字:常见 句子 两个 提取 程序 C++      更新时间:2023-10-16

我正试图用c++编写一个程序,在用户输入的两个句子中查找共享字母,我输入的代码如下,但由于某种原因,它不起作用,函数必须返回这两个句子之间的所有共享字母。提前感谢!

        #include<iostream>
#include<cstring>
using namespace std;
int  findSharedLetters(const char line1[], const char line2[]);
void main()
{
    char line1[100] , line2[100];
    cout<<"Enter line 1 : ";
    cin.getline(line1 , 100);
    cout<<"Enter line 2 : ";
    cin.getline(line2 , 100);
    char result = findSharedLetters(line1,line2);
    cout<<"shared letters : "<<result<<endl;
    system("pause");
}
int  findSharedLetters(const char line1[], const char line2[])
{
for(int i = 0;i<line1[100];i++)
    {
    for(int x = 0;x<line2[100];x++)
        {
        if(line1[i] == line2[x])
        {
        return line1[i];
        }
        }
    }
}

一种可能的解决方案是基于使用类std::stringstd::set以及标准算法std::set_intersection

这是的一个示例程序

#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
std::set<char> FindSharedLetters( const std::string &s1, const std::string &s2 )
{
    std::set<char> st1( s1.begin(), s1.end() );
    std::set<char> st2( s2.begin(), s2.end() );
    std::set<char> st0;
    std::set_intersection( st1.begin(), st1.end(), 
                           st2.begin(), st2.end(),
                           std::inserter( st0, st0.end() ) );
    return ( st0 );
}
int main() 
{
    std::string s1( "DCAB" );
    std::string s2( "FRDC" );
    for ( char c : FindSharedLetters( s1, s2 ) ) std::cout << c << ' ';
    std::cout << std::endl;
    return 0;
}

输出为

C D

该解决方案相对于字母区分大小写。

如果您只需要在案例中查找独立的常见字母字符,则任务会更加复杂。

以下是如何使用与上述相同的容器和算法来完成

#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
#include <cctype>
std::set<char> FindSharedLetters( const std::string &s1, const std::string &s2 )
{
    std::set<char> st1;
    std::set<char> st2;
    for ( char c : s1 )
    {
        if ( std::isalpha( c ) ) st1.emplace( std::toupper( c ) );
    }
    for ( char c : s2 )
    {
        if ( std::isalpha( c ) ) st2.emplace( std::toupper( c ) );
    }
    std::set<char> st0;
    std::set_intersection( st1.begin(), st1.end(), 
                           st2.begin(), st2.end(),
                           std::inserter( st0, st0.end() ) );
    return ( st0 );
}
int main() 
{
    std::string s1( "12dCAB$" );
    std::string s2( "#FRDc12" );
    for ( char c : FindSharedLetters( s1, s2 ) ) std::cout << c << ' ';
    std::cout << std::endl;
    return 0;
}

同样,输出是

C D

一旦找到一个字母对,就会从函数返回。将字母存储在字符串中,然后返回该字符串。

#include <iostream>
#include<cstring>
using namespace std;
std::string findSharedLetters(const char line1[], const char line2[]);
int main(int argc, const char * argv[])
{
  char line1[100] , line2[100];
  line1[0] = ''; // make sure it's empty
  line2[0] = ''; // make sure it's empty
  cout<<"Enter line 1 : ";
  cin.getline(line1 , 100);
  cout<<"Enter line 2 : ";
  cin.getline(line2 , 100);
  std::string result = findSharedLetters(line1,line2); // function returns string now
  cout<<"shared letters : "<<result<<endl;
// removed system("pause"); as my compiler cried...
    return 0;
}
std::string findSharedLetters(const char line1[], const char line2[]){
  std::string returnLine = ("");
  for(int i = 0;i<(sizeof(line1)/sizeof(*line1));i++) // iterate through size of array
  {
    for(int x = 0;x<(sizeof(line2)/sizeof(*line2));x++) // iterate through size of array
    {
      if(line1[i] == line2[x])
        if (!(line1[i]=='')) { // if empty space detected, it skips
        returnLine += line1[i]; // add matching char to string
        }
    }
  }
  return returnLine; //return the string
}