Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这段代码如何在字符串中找到重复字符?_C_Duplicates - Fatal编程技术网

C 这段代码如何在字符串中找到重复字符?

C 这段代码如何在字符串中找到重复字符?,c,duplicates,C,Duplicates,示例:给定一个字符串(在本例中为char*word),您希望查找重复的字符(字节) 我想知道是否有人能向我解释一下以下的工作原理: int表[256]={0}; 对于(inti=0;i

示例:给定一个字符串(在本例中为
char*word
),您希望查找重复的字符(字节)

我想知道是否有人能向我解释一下以下的工作原理:

int表[256]={0};
对于(inti=0;i
之后,如果重复或不相似,您可以使用另一个循环进行检查:

for(inti=0;i1){…}
这是怎么回事?我不明白为什么重复字符在表中大于1?

将我的评论转换成半连贯的答案


第一个循环统计0..255范围内每个字节值的出现次数(它为找到的每个字节值的字节计数加一);重新扫描将查找字符串中出现多次的字节值,即重复的定义

例如,循环都假定字符串编码在单字节代码集中,而不是像UTF-8那样的多字节代码集中。他们还假设普通
char
是无符号类型(不常见;大多数x86平台都有有符号的普通
char
类型),或者字符串中没有
word[i]
为负数的值(没有重音字符)

因此,为了安全起见,规范应为:

for (int i = 0; i < len; i++)
    table[(unsigned char)word[i]]++;

for (int i = 0; i < len; i++)
{
    if (table[(unsigned char)word[i]] > 1)
    {
        …
    }
}
for(int i=0;i1)
{
…
}
}
您可以使用
word[i]&0xFF
代替cast;它甚至有更少的角色,但我认为演员阵容更清晰(而且角色数量是一条红鲱鱼——请不要追逐它)。请注意,无论纯
char
是有符号类型还是无符号类型,这两种变体(cast和mask)都能正常工作(尽管代码确实做出了最合理的假设,即
char\u BIT
是8,而不是更大的数字-不能更小)

但是为什么它会添加到它找到的每个char值,而不仅仅是表中当前位置上的char值呢?当我打印出内存位置时,我从一个示例字符串
“abcda”
中看到,两个a在内存中是相同的。我认为在表数组中,它们必须是不同的(但连续的)位置;为什么是一样的

当您在字符串中找到
'a'
时,有一个字节值,通常是97,与该字符关联。因此,当计数代码读取
word[i]
并且
word[i]
的内容是
'a'
,就好像数组中有97个(事实上,数组中有97个),所以第一个循环递增
表[97]
-当读取
abcda
中的第一个
a
时,将其从0更改为1,当读取第二个
a
时,从1到2

当所有的说和做都完成时,角色只是数字(但在所有的说和做之前,有很多的说和做可以发生;幸运的是,你大部分时间不必经历所有这些)

将我的评论转换成半连贯的答案


第一个循环统计0..255范围内每个字节值的出现次数(它为找到的每个字节值的字节计数加一);重新扫描将查找字符串中出现多次的字节值,即重复的定义

例如,循环都假定字符串编码在单字节代码集中,而不是像UTF-8那样的多字节代码集中。他们还假设普通
char
是无符号类型(不常见;大多数x86平台都有有符号的普通
char
类型),或者字符串中没有
word[i]
为负数的值(没有重音字符)

因此,为了安全起见,规范应为:

for (int i = 0; i < len; i++)
    table[(unsigned char)word[i]]++;

for (int i = 0; i < len; i++)
{
    if (table[(unsigned char)word[i]] > 1)
    {
        …
    }
}
for(int i=0;i1)
{
…
}
}
您可以使用
word[i]&0xFF
代替cast;它甚至有更少的角色,但我认为演员阵容更清晰(而且角色数量是一条红鲱鱼——请不要追逐它)。请注意,无论纯
char
是有符号类型还是无符号类型,这两种变体(cast和mask)都能正常工作(尽管代码确实做出了最合理的假设,即
char\u BIT
是8,而不是更大的数字-不能更小)

但是为什么它会添加到它找到的每个char值,而不仅仅是表中当前位置上的char值呢?当我打印出内存位置时,我从一个示例字符串
“abcda”
中看到,两个a在内存中是相同的。我认为在表数组中,它们必须是不同的(但连续的)位置;为什么是一样的

当您在字符串中找到
'a'
时,有一个字节值,通常是97,与该字符关联。因此,当计数代码读取
word[i]
并且
word[i]
的内容是
'a'
,就好像数组中有97个(事实上,数组中有97个),所以第一个循环递增
表[97]
-当读取
abcda
中的第一个
a
时,将其从0更改为1,当读取第二个
a
时,从1到2

当所有的说和做都完成时,角色只是数字(但在所有的说和做之前,有很多的说和做可以发生;幸运的是,你大部分时间不必经历所有这些)

函数移除副本(str){
让结果=”;
设freq={};
for(设i=0;i