【问题标题】:Comparing elements between 2 strings比较两个字符串之间的元素
【发布时间】:2017-12-03 00:08:15
【问题描述】:

你好,假设我有 2 个字符串,“Today is a nice day”和“ao”。我想删除出现在第一个字符串中的第二个字符串的字符。

这是我的问题:

char c[20];
char p[10];
int i,j;
int l1,l2;

printf("Enter a string \n");
scanf("%s",cd);

printf("Enter another string \n");
scanf("%s",car);

len1 = strlen(cd);
len2 = strlen(car);

for (i=0;i<len1;i++){
    for (j=0;j<len2;j++){
        if (cd[i]==car[j]){
            cd[i]="";
        }
    }
}

我想要的是第一个字符串就像“Tdy is nice dy”。所以我清空元素相同的位置以便稍后重新定位。

显然“cd[i]==car[j]”不能在 C 上完成,我得到“从 'const char*' 到 'char' 的无效转换。

所以我几乎被困住了。我会感谢任何帮助。

【问题讨论】:

  • cd[] 和 char[] 是如何声明和初始化的?请给minimal reproducible example。无论如何,比较两个字符是否相等是没有问题的。有问题的是你的下一行。
  • 1) 发布真实完整的错误信息。 2)发布cd和car的声明。
  • 开启警告。这段代码甚至不应该编译,因为您将 const char * 分配给 char,即指向整数的指针:cd[i]=""; 字符串文字 "" 在分配给某物时转换为指针,并且cd[i] 大概是 char。你有一个char 的数组。您不能只是开始向其中分配指针并期望得到有意义的结果。

标签: c string elements


【解决方案1】:

1) 这是一个与您的算法尽可能匹配的解决方案。 您所需要的只是一个额外的循环并替换无法用cd[i]=0; 编译的cd[i]="";。编译器给出的错误与表达式 cd[i]=""; 相关,cd[i] 是字符类型,您不能将类型为 const char * 的字符串 "" 分配给 char 变量。 cd[i] 是一个字符 "" 是一个指针。

cd[i]=0; 操作给了你想要的:我清空元素相同的位置以便稍后重新定位它。它用 0 替换不需要的字符。

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

int main()
{
    char cd[]  = "Today is a nice day";
    char tmp[] = "Today is a nice day";
    char car[] = "ao";
    int i;
    int j;
    int k;

    int len1 = strlen(cd);
    int len2 = strlen(car);

    for (i=0;i<len1;i++){
        for (j=0;j<len2;j++){
            if (cd[i] == car[j]){
               cd[i]=0;
          }
      }
    }

   k = 0;
   for (i=0; i<len1; i++)
   {  
        if(cd[i] == 0)
        {
        }
        else
        {
            tmp[k] = cd[i];
            k++;
        }
    }      
    tmp[k] = 0; /* remember to terminate the tmp */


    printf("%s\n", tmp);

    strcpy(cd,tmp);
    printf("%s\n", cd); 

    return 0;
}

输出:

Tdy is  nice dy                                                                                   
Tdy is  nice dy 

或者,您可以跳过它,而不是用 0 清除不需要的字符。该解决方案如下:

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

 int main()
    {
        char cd[]  = "Today is a nice day";
        char car[] = "ao";
        int i;
        int j;
        int k = 0;
        int skip = 0;


        int len1 = strlen(cd);
        int len2 = strlen(car);

        for (i=0; i<len1; i++)
        {
            for (j=0; j<len2; j++)
            {
                if (cd[i] == car[j])
                {
                    skip++; // make note that this character is not needed
                }
            }

            if(skip == 0)
            {
                cd[k] = cd[i]; // copy the character
                k++; // increase the position index
            }
            else
            {
                // skip the copy of charcter; clear the skip marker
                skip = 0;
            }              
        }

        cd[k] = 0; // remember to terminate the new ck string!          
        printf("%s\n", cd); 

        return 0;
    }  

输出:

Tdy is  nice dy  

【讨论】:

  • 虽然这个答案给出的代码可以做 OP 想要的,但它没有解释任何东西。它没有解释错误消息在cd[i]=""; 行上,而不是cd[i]==car[j] 行上。它没有解释错误消息或说明cd[i]=""; 不正确的原因。它没有解释字符串和字符之间的区别或使用" 与'。由于这些缺点,我很想将其否决为无用。
  • 啊,我明白我的错误了,你甚至包括重新定位!,非常感谢
  • @NelsonSMG 当您“跳过”一个字符时,我还提供了解决方案。如果您喜欢它,您可以通过点击向上箭头为解决方案投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多