练习基本的 - 程序问题

practicing the basic - problem with program

我是这个网站的新人,希望可以回答 post 这样的问题。 我正在尝试学习 C 语言,但我遇到了一个问题,我一直坚持着。

-- 我需要得到 10 个数字然后打印它但没有重复的数字: 就像我得到 1 2 3 4 5 6 1 2 3 - 我只需要打印 1 2 3 4 5 6. --

这就是我所做的:

#include <stdio.h>

int main()
{
    int arr1[10] = {0};
    int arr2[10] = {0};
    int i, j, c;
    
    printf("Please enter 10 numbers:\n");
    
    for (i=0; i<10; ++i) {
        scanf(" %d", &arr1[i]);
    }
    
    i = j = c = 0;
    
    for (i=0; i<10; ++i) {
        while (arr1[i] != arr2[j], j<10) {
            ++j;
        }
         if (j==10) {
               arr2[c] = arr1[i];
               ++c;
            }
        j=0;
    
    }
    
    for (i=0; i<10; ++i) {
        printf("%d ", arr2[i]);
    }
    
   

    return 0;
}

输入 - 8 1 2 1 2 3 4 5 6 7

输出 - 8 1 2 1 2 3 4 5 6 7(我不应该打印重复的数字)

在这个 while 循环中

while (arr1[i] != arr2[j], j<10) 

使用了带逗号运算符的表达式。逗号运算符第一个操作数 arr1[i] != arr2[j] 的值被丢弃,表达式的结果是逗号运算符 j<10.

第二个操作数的值

因此在循环之后变量 j 将始终等于 10。事实上你有以下循环

    while ( j < 10 ) {
        ++j;
    }

因为逗号运算符的第一个操作数没有副作用。

你必须写

while ( j < c && arr1[i] != arr2[j] ) 
        ++j;
    }
     if (j==c) {
           arr2[c] = arr1[i];
           ++c;
        }

即只需要检查第二个数组的 c 个元素。

还有这个for循环

for (i=0; i<10; ++i) {
    printf("%d ", arr2[i]);
}

应该改写成

for (i=0; i < c; ++i) {
    printf("%d ", arr2[i]);
}

实际上,要输出数组的唯一元素,无需创建第二个数组。该程序可以如下所示

#include <stdio.h>

int main( void )
{
    enum { N = 10 };
    int arr1[N] = {0};
    
    printf( "Please enter %d numbers:\n", N );
    
    for ( size_t i = 0; i < N; ++i ) 
    {
        scanf( "%d", &arr1[i] );
    }
    
    for ( size_t i = 0; i < N; ++i ) 
    {
        size_t j = 0;

        while ( j != i && arr1[i] != arr1[j] ) ++j;

        if ( j == i ) printf( "%d ", arr1[i] );
    }

    putchar( '\n' );
}

请注意,您应该使用命名常量而不是像 10 这样的幻数,并且您应该在使用它们的最小范围内声明变量。