c - 提取数组中的唯一元素(来自 K 和 R C ex1-14)

标签 c arrays algorithm loops kernighan-and-ritchie

再次将 C 新手返回这里。我正在尝试 K 和 R C 中的练习,在尝试练习 1-14 的过程中,我真的被难住了。 我的解决方案有效,但并不总是正确的,我正在寻求帮助来完善我所写的内容,或者是否有更好(更容易理解!)的方法! 我的脚本:

#include <stdio.h>

/* How many times a character appears in an array */
main()
{
    int c;
    int count = 0;
    int uniquecount = 0;
    char array[20];
array[0] = '\0';

while((c = getchar()) != EOF)
{
    array[++count] = c;
}

/* for each element in array,
 * check if array[each] in newarray.
 * if array[each] in newarray
 * break and start checking again.
 * if array[each] not in newarray
 * add array[each] to end of newarray*/

printf("count = %d\n", count);
array[count] = '\0';
char newarray[count];
newarray[0] = '\0';

for(int a = 0; a < count; ++a)
{
    for(int b = 0; b <= a; ++b)
    {
        if(newarray[b] == array[a])
            break;
        if(newarray[b] != array[b])
        {
            newarray[b] = array[b];
            ++uniquecount;
        }

    }
}

printf("uniquecount = %d\n", uniquecount);    
newarray[uniquecount + 1] = '\0';

printf("array => ");
for(int i = 0; i < count; ++i)
    printf("\'%c\'", array[i]);
printf("\n");
printf("newarray => ");
for(int i = 0; i < uniquecount + 1; ++i)
{
    if(newarray[i] != '\0')
        printf("\'%c\'", newarray[i]);
}
printf("\n");

}

当我尝试一些简单的字符串时,它可以工作,有时却不能:

./times_in_array 
this is 
count = 9
uniquecount = 5
array => '''t''h''i''s'' ''i''s'' '
newarray => 't''h''i''s'' '
 ./times_in_array 
something comes
count = 16
uniquecount = 11
array => '''s''o''m''e''t''h''i''n''g'' ''c''o''m''e''s'
newarray => 's''o''m''e''t''h''i''n''g'' ''c'
 ./times_in_array 
another goes
count = 13
uniquecount = 12
array => '''a''n''o''t''h''e''r'' ''g''o''e''s'
newarray => 'a''n''o''t''h''e''r'' ''g''o''e''s'

请有人指导我哪里错了?非常感谢!

最佳答案

我们最常写的是 int main(void) 而不是 main()

此外,了解当您像这样访问新数组时非常重要:

newarray[b]

您实际上正在访问未初始化内存。然而,由于匹配 array[a] 的随机字符的概率太小,看来您可以侥幸逃脱。

因此,我建议您初始化新数组,如下所示:

for(int i = 0; i < count; ++i)
    newarray[i] = '\0';

现在,我不再提供我的解决方案,而是坚持让你明白你做错了什么;这就是你教育自己的方式。在内部循环开始时打印数据将非常有帮助,例如:

printf("b = %d, a = %d, newarray[b] = %c, array[a] = %c, array[b] = %c\n", b, a, newarray[b], array[a], array[b]);

并在增加唯一计数器时打印一条消息,如下所示:

printf("UNIQUE, %d\n", uniquecount);

当您执行程序时,您将看到:

...
b = 9, a = 12, newarray[b] = g, array[a] = s, array[b] = g
b = 10, a = 12, newarray[b] = , array[a] = s, array[b] = o
UNIEUQ, 10
b = 11, a = 12, newarray[b] = , array[a] = s, array[b] = e
UNIEUQ, 11
b = 12, a = 12, newarray[b] = , array[a] = s, array[b] = s
UNIEUQ, 12
uniquecount = 12
array => '''a''n''o''t''h''e''r'' ''g''o''e''s'
newarray => 'a''n''o''t''h''e''r'' ''g''o''e''s'

这强烈暗示你出了什么问题。在 's' (gos 的最后一个字母)第一次被发现是唯一的(这很好)之后,我们不会打破循环,因此您的代码将继续检查新数组并被愚弄,认为这个 's' 是再次独一无二。

因此,当您找到唯一元素时添加一个中断,此时应该没问题:

++uniquecount;
break;

关于c - 提取数组中的唯一元素(来自 K 和 R C ex1-14),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44225626/

相关文章:

arrays - PLpgSQL:将每条记录存储在For循环中并返回json

c++ - 从指针指向内存的二进制文件中读取结构

c++ - Arduino - 如何从serial.read()提供结构?

java - 我应该使用哪个数组/列表来保留静态索引?

javascript - 用于构造查询的 JSON 数据的有效方法

algorithm - 为什么这个算法的Big-O复杂度是O(n^2)?

algorithm - 如何创建允许语法错误的 AST 解析器?

algorithm - 查找二叉树的根值?

c - 对变量 i 的 undefined reference

汇编中的 C 调用约定(64 位)- scanf