【问题标题】:Returning common chars返回常用字符
【发布时间】:2019-03-13 22:33:56
【问题描述】:

我的代码应该比较 2 个字符串并按字母顺序返回常见字符。如果没有公共字符,它将返回一个空字符串。

但是程序没有运行。

代码

void strIntersect(char *str1, char *str2, char *str3)
{
int i,j, k;
i = 0;
j = 0;
k = 0;
while(str1[i]!='\0' || str2[j]!='\0')
{
    if(strcmp(str1[i],str2[j])>0)
    {
        str3[k] = str1[i];
        k++;
    }
    else if (strcmp(str2[j],str1[i])>0)
    {
        str3[k] = str2[j];
        k++;
    }
i++;
j++;
}
}

例子

Input string 1:abcde
Input string 2:dec
Output: cde

如何让它工作?

【问题讨论】:

  • 您正在描述函数返回的内容......但返回类型是void,它没有返回任何内容。另外,我认为while条件下的||应该是&&
  • strcmp 比较 2 个字符串,而不是单个字符,所以 strcmp(str1[i],str2[j]) 应该给你一个警告或错误。
  • 这道题是关于集合交点的;不是字符串比较,可以在 O(n+m) 中完成(假设您对多字节字符不感兴趣,nm 分别是两个字符串的长度。
  • 你需要一个 main 函数来调用你的函数 strIntersect
  • “程序没有运行”对您的问题没有帮助。

标签: c arrays string while-loop


【解决方案1】:

您的 if case 和 Else if case 相同,您只是根据索引比较元素。即您将第一个元素与第一个元素进行比较,将第二个元素与第二个元素进行比较,依此类推。这不会为您提供解决方案。我建议使用两个 for 循环。如果你愿意,我稍后会为你提供代码

【讨论】:

    【解决方案2】:

    一个选项是为第一个字符串中的每个字符迭代完整的第二个字符串

    int i = 0;
    int k = 0;
    while(str1[i] != '\0') {
        int j = 0; 
        while(str2[j] != '\0') {
            if (str1[i] == str2[j]) {
               str3[k] = str1[i];
               k++;
            }
            j++;
        }
        i++;
    }
    

    我替换了 strcmp,因为您正在比较单个字符而不是 string

    【讨论】:

      【解决方案3】:

      你的代码有很多问题

      1. 简单的字符比较不需要strcmp
      2. 第三个字符是调用者分配的吗?
      3. 如果源字符串大小不同或不按字母顺序排列,您的方法将不起作用。

      我的解决方案假设输入是 ASCII,并且是高效的(使用简单的 char 数组,索引表示字符的 ASCII 值)。
      如果在str1 中找到字符,则char map 为1,如果是普通字符,则为2,否则为0。

      void strIntersect(char *str1, char *str2, char *str3)
      {
        int i=0, j=0, k=0;
        char commonCharsMap[128] = { 0 };
      
        while(str1[i] != '\0')
        {
          commonCharsMap[str1[i++]] = 1;
        }
      
        while(str2[j] != '\0')
        {
          if(commonCharsMap[str2[j]] == 1) 
          {
            commonCharsMap[str2[j++]] = 2;
          }
        }
      
        for(i=0; i<128; i++)
        {
          if(commonCharsMap[i] == 2)
          {
            str3[k++] = i;
          }
        }
        str3[k++] = '\0';
      }
      
      int main() 
      {
        char str1[] = "abcde";
        char str2[] = "dce";
        char str3[30];
        strIntersect(str1, str2, str3);
      
        printf("Common chars: %s\n", str3);
        return 0;
      }
      

      【讨论】:

      • 正是应该如何解决的,我打算输入这个直到我看到你的答案。我要添加的唯一区别是包括limits.h 并使用1 &lt;&lt; CHAR_BIT 作为查找数组维度(当然还有str3 的大小限制和一个附加参数)。我真诚地希望 OP 看到这个答案,因为我怀疑这就是它可能打算解决的方式。
      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多