gpt4 book ai didi

c - 查找 2 个字符串是否由相同单词组成的函数

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:31 26 4
gpt4 key购买 nike

我需要在 C 中创建一个函数,用于查明 2 个字符串是否由相同的单词组成。从当前代码中可以看出,我将每个字符串加载到单独的数组中。我做到了,在数组中有单词,都是小写字母,每个单词之间只有 1 个空格,并且没有所有非字母字符。我虽然可以对字符串进行排序并在它们上调用 strcmp,但不能这样做,因为可能有诸如 "dog dog dog cat"和 "dog cat"之类的字符串,这些字符串来自相同的单词,因此该函数应该返回 1,但如果只是排序并使用 strcmp 则不会。所以我虽然可以将所有重复的单词合并为 1,然后进行排序和 strcmp,但是仍然存在一个问题,即当出现诸如“dog”和“god”之类的单词时,这是两个不同的单词,但是函数排序后仍会将它们视为相同。“dog dog dog cat” “dog cat” - 相同的词“HI HeLLO!!'” “hi,,,hello hi” - 相同的词如果有任何帮助,我将不胜感激。我真的不知道如何创建它,我坐了很长时间仍然想不通。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int sameWords( const char * a, const char * b)
{
char * array1=NULL;
char * array2=NULL;
int length1=0, length2=0, i=0, j=0;
while(a[i])
{
if(i>=length1)
{
length1+=250;
array1=(char*)malloc(length1*sizeof(char));
}
if(isspace(a[i]) && !isspace(a[i-1]))
{
array1[i]=a[i];
}
if(isalpha(a[i]))
{
array1[i]=tolower(a[i]);
}
i++;
}
while(b[j])
{
if(j>=length2)
{
length2+=250;
array2=(char*)malloc(length2*sizeof(char));
}
if(isspace(b[j]) && !isspace(b[j-1]))
{
array2[j]=b[j];
}
if(isalpha(b[j]))
{
array2[j]=tolower(b[j]);
}
j++;
}
}

int main()
{
sameWords("This' is string !!! ", "THIS stRing is !! string ");
return 0;
}

最佳答案

您已经了解了解决问题的两种方法。复杂的是将每个字符串拆分成单词,对它们进行排序,然后剔除重复项,这在排序数组中很容易。更简单的方法是将第一个字符串拆分为单词,然后在第二个字符串中搜索每个单词。然后反过来做同样的事情:拆分第二个并检查第一个中的单词。

这两种方法都需要您拆分字符串。这也是您的代码似乎存在问题的地方。 (你已经有了基本的思路,看单词边界,但你似乎不知道如何存储单词。)

基本问题是:您将如何表示单词,即 C 字符串的子字符串?有多种方法。您可以使用指向字符串的指针和字符串长度,也可以将它们复制到另一个缓冲区。

下面是一个将字符串 a 拆分为单词然后检查是否可以在 b 中找到每个单词的算法:

/*
* Return 1 if all words in a can be found in b,
* return 0 otherwise.
*/
int split_and_check(const char *a, const char *b)
{
int begin = -1; /* marker for beginning of word */
char word[80]; /* temporary buffer for current word */
int prev = 0; /* previously read char to detect word bounaries */
int len; /* current length of word */
int i;

i = 0;
while (1) {
if (isalpha(a[i])) {
if (!isalpha(prev)) {
begin = i;
len = 0;
}
if (len < 80) word[len++] = a[i];
} else {
if (len > 0) {
word[len] = '\0'; /* manually null-terminate word */

if (strstr(b, word) == NULL) {
/* fail on string mismatch */
return 0;
}
len = 0; /* reset word-length counter */
}
}
if (a[i] == '\0') break; /* check end here to catch last word */
prev = a[i++];
}

return 1;
}

当前单词存储在本地字符缓冲区word 中,长度为len。请注意在 b 中搜索 word 之前如何将零结束标记 '\0' 手动添加到 word 中:库函数 strstr 在另一个字符串中查找字符串。两个字符串都必须以零结尾。

这只是解决方案的一半。您必须以相反的方式检查字符串:

int same_words(const char *a, const char *b)
{
if (split_and_check(a, b) == 0) return 0;
if (split_and_check(b, a) == 0) return 0;

return 1;
}

这还不是您问题的确切解决方案,因为字符串匹配是区分大小写的。我跳过了这部分,因为这样更容易:strstr 区分大小写,我不知道有任何忽略大小写的变体。

关于c - 查找 2 个字符串是否由相同单词组成的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20331998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com