从 C++ 中的两个字符串中找到唯一的共同词
Posted
技术标签:
【中文标题】从 C++ 中的两个字符串中找到唯一的共同词【英文标题】:Find the only common word from two strings in c++ 【发布时间】:2019-03-12 18:43:44 【问题描述】:我需要从包含两个字符串的常用词的函数中返回一个字符串(假设只有一个常用词)。
我可以使用函数strcmp
、strlen
、strcat
和strcpy
。
当字符串中的第一个单词相同时,我进行了管理,但如果在此之后,它就不起作用了。
不起作用的示例:
str1[] = "Hello world"; //string 1
str2[] = "Thanks you world"; // string 2
Example that work:
char str1[] = "Hello world"; //string 1
char str2[] = "Hello Danny"; // string 2
这是我的代码:
#include <iostream>
using namespace std;
# include <string.h>
char * Strcom(char str1[], char str2[]); //declare function
int main()
char str1[] = "Hello world" ; //string 1
char str2[] = "Thanks you world" ; // string 2
Strcom(str1, str2);
char * Strcom(char str1[], char str2[])
char temp[10];
int i = 0, z = 0;
while (i <= strlen(str1))//run over str1, copying word in the next while loop
int k = 0;
bool check = 0;
while ((z < strlen(str2)) && (k < strlen(temp)))//check that I withing the lenght...
char temp[10] = 0 ;
while ((str1[i] != ' ')&&(i<10))//copy one word to temp from str1
temp[i] = str1[i];
i++;
if (i != strlen(temp))
temp[i] = '\0';
else
temp[i-1] = '\0';
i++;//to jump over ' '
while (str2[z] != ' ') //check if its the same world (temp and str2)
if (temp[k] == str2[z])
k++, z++;
check = 1;
else
check = 0;
break;
if (((str2[z] == ' ') || (str2[z] == '\0')) && (check == 1))//its the same word
temp[k] = '\0';//to be able to print it
cout <<"my word is: " <<temp<< endl;
return temp;
z += 1;
k = 10;//to go to the outer while loop
i++;
【问题讨论】:
如果只有一个常用词而且你已经找到了,你为什么会觉得卡住了? 对你的导师任意的功能限制太糟糕了。std::istringstream
和 std::unordered_set<std:string>
带有一个迭代器范围构造和一个单遍循环将使它变成大约六行代码。具有讽刺意味的是,他们让您使用大多数 C++ 工程师在日常使用中避免使用的一组函数。忍住告诉他们你是否想要一门 C 语言课程的冲动,你会报名参加的。
@Begginer 无意冒犯,但这对他们来说是愚蠢的。这两种语言共享一个子集语法这一事实并不是这样做的理由。每一个本身就足够难了,并且为每个使用标准库的通用系统会迅速分散任何语法共性。 C 程序员会做他们想做的事; C++ 程序员会按照我的描述去做。显然,它们是非常、非常不同的东西。并不意味着你不能在 C++ 中做前者(语言和库毕竟支持它),但如果你有 C++ 标准库供你使用,你真的不会。
很好,您添加了示例,但究竟是什么“不起作用”?非工作示例的输出是什么?
@Caleth 我无意冒犯 OP。另一方面,课程的设计者应该受到鞭笞。
【参考方案1】:
如果您需要 C 风格的 C++ 代码来学习而不是生产,可以通过以下方式解决所需的功能:
bool CommonWord( const char* words_a, const char* words_b, char* result )
// Iterate throught the words of words_a
while( IsolateWord( words_a, result ) )
// Start from the beginning of words_b
const char* word_list = words_b;
while( *word_list != '\0' )
// See if words match
int eaten = 0;
if( CompareWord( result, words_b, &eaten ) )
// Success, the matching word was copied to result before
return true;
else
// Go to the beginning of the next word or the end of the string
for( word_list += eaten; ( *word_list != ' ' ) && ( *word_list != '\0' ); word_list++ )
;
// No matching words found, empty result
result[ 0 ] = '\0';
return false;
bool IsolateWord( const char* words, char* result )
// Skip leading spaces
const char* start = words;
while( *start == ' ' )
start++;
// Find end of word
const char* end = start;
while( ( end != ' ' ) && ( end != '\0' ) )
end++;
// No more word
if( end == start )
return false;
// Copy word to buffer
while( *start != '\0' )
*result++ = *start++;
*result = '\0';
return true;
bool CompareWord( const char* word_one, const char* word_list, int* eaten )
// Go until characters differ or strings end
for( *eaten = 0; ( word_one[ *eaten ] == word_list[ *eaten ] ) && ( word_one[ *eaten ] != '\0' ); ( *eaten )++ )
;
// If reached end of word_one, and word_list contains the same characters plus a space or '\0', then the word matches
if( ( word_one[ *eaten ] == '\0' ) && ( ( word_list[ *eaten ] == ' ' ) || ( word_list[ *eaten ] == '\0' ) ))
return true;
else
return false;
警告:我手头没有 C 或 C++ 编译器,所以我什至没有编译上面的。
【讨论】:
说实话,我几乎同时学习了两个学位,所以答案对我来说太晚了,我没有也没有时间检查建议代码其工作。以上是关于从 C++ 中的两个字符串中找到唯一的共同词的主要内容,如果未能解决你的问题,请参考以下文章
LintCode日记——两个字符串是变位词(C++,Python)
2021-12-18:找到字符串中所有字母异位词。 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成