c - 如何计算两个字符串之间共有的不同字符的数量?
问题描述
程序如何计算两个字符串之间共有的不同字符的数量?
例如,如果s1="connect"
和s2="rectangle"
,计数显示为 5,但正确答案为 4;重复字符只能计算一次。如何修改此代码以使计数正确?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,count=0;
char s1[100],s2[100];
scanf("%s",s1);//string 1 is inputted
scanf("%s",s2);//string 2 is taken as input
for(i=1;i<strlen(s1);i++)
{
for(j=1;j<strlen(s2);j++)
{
if(s1[i]==s2[j])//compare each char of both the strings to find common letters
{
count++;//count the common letters
break;
}
}
}
printf("%d",count);//display the count
}
该程序将两个字符串作为输入,并显示这些字符串中常见字符的计数。请让我知道这段代码有什么问题。
解决方案
如果必须忽略重复字符,程序必须“记住”已经遇到的字符。您可以通过将已处理的字符存储到字符数组中来做到这一点,然后在处理其他字符时查阅该数组。
您可以使用计数器变量来跟踪常见字符的数量,例如
int ctr=0;
char s1[100]="connect", s2[100]="rectangle", t[100]="";
这里,t
是将存储检查的字符的字符数组。它的大小与其他 2 个字符数组中最大的一个的大小相同。
现在使用像这样的循环
for(int i=0; s1[i]; ++i)
{
if(strchr(t, s1[i])==NULL && strchr(s2, s1[i])!=NULL)
{
t[ctr++]=s1[i];
t[ctr]=0;
}
}
t
最初有一个空字符串。以前不存在的字符通过循环体添加到它,只有当正在检查的字符(即, )不在另一个字符串中但存在于另一个字符串(即, )t
时,才会执行该循环体。s1[i]
t
s2
strchr()
是一个带有原型的函数
char *strchr( const char *str, int c );
strchr()
在 指向的字符串中查找 c 的第一次出现str
。NULL
如果c
中不存在则返回str
。
您的使用scanf()
可能会引起麻烦。
利用
scanf("%99s",s1);
(其中 99 比数组的大小小一s1
)而不是
scanf("%s",s1);
以防止溢出问题。并检查返回值scanf()
是否为1
. scanf()
返回它所做的成功分配的数量。
或用于fgets()
读取字符串。
阅读这篇文章以了解更多信息。
请注意,数组索引从0
. 因此,在您的循环中,不会检查字符串的第一个字符。
所以应该是这样的
for(i=0;i<strlen(s1);i++)
代替
for(i=1;i<strlen(s1);i++)
推荐阅读
- git - 吉特。删除分支
- java - for 循环迭代 - 如何避免逗号
- android - Tablayout 选项卡中的键盘导航
- javascript - PayPal checkout.js - 获取 paymentID 和 payerID
- java - 在 android 中使用 AIDE 时出现声明消息意外结束,为什么?
- django-treebeard - 在 django-treebeard 中,如何为兄弟姐妹添加孩子
- php - 密码不使用 MySQLi 散列
- mysql - 带有连接和分组依据的mysql查询
- php - 用于画廊简码的 WP 插件
- javascript - 如何将 webdriverio 驱动程序传递给模块化设计的函数?