C程序中的scanf问题,无法单独输入列表的元素并输出它们

Problem with scanf in C program to input elements of a list individually and output them

提问人:Vien Nguyen 提问时间:8/29/2023 最后编辑:chqrlieVien Nguyen 更新时间:8/29/2023 访问量:55

问:

我正在尝试制作一个将元素单独输入到列表中的程序,但不知何故,它只运行到第二个元素,我不知道为什么。

#include <stdio.h>

int main() {
    int n; 
    int arr[n];
    scanf("%d", &n);
    
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    for (int x = 0; x < n; x++) {
        printf("%d", arr[x]);
    }
    return 0;
}
5
1
2
12
--------------------------------
Process exited after 1.99 seconds with return value 0
Press any key to continue . . .

这是我最初得到的。我尝试在第二个中添加一个角色,但它让我得到了这个。\\nscanf

5
1
2
3
12
\--------------------------------
Process exited after 5.1 seconds with return value 0
Press any key to continue . . .
C 输入 扫描

评论

4赞 Some programmer dude 8/29/2023
当你定义数组时,它的值是多少?请记住,变量定义不是追溯完成的,它们按照您编码的确切顺序发生。这意味着在程序运行中的那个点的值将是不确定的(将该值视为随机值或垃圾值可能会有所帮助)。直到创建数组后,您才将实际值读入 。简单的解决方案:切换调用位置和数组定义。arrnnnscanf
2赞 paulsm4 8/29/2023
@Vien Nguyen:一些程序员试图告诉你的是,你的程序表现出未定义的行为。强烈建议:使用调试器。在程序执行时查看变量。
0赞 Vien Nguyen 8/29/2023
@Someprogrammerdude好吧,我想我明白了,但现在有一个新问题。由于某种原因,第二个 scanf 比预期多工作一次,但输入的元素与预期相同。''' 4 1 2 3 4 5 1 2 3 4 -------------------------------- 进程在 4.212 秒后退出,返回值为 0 按任意键继续 . . .''' 我需要输入四个元素,但不知何故,scanf 运行了 5 次,但仍然返回 4 个元素的结果。
0赞 Some programmer dude 8/29/2023
@VienNguyen 让我猜猜,你把你改成了?从格式中删除换行符,它不是必需的,并且会给您带来比它可能解决的问题更多的问题(在这种情况下,它不会解决任何问题,只会引起问题)。scanfscanf("%d\n",...)

答:

1赞 0___________ 8/29/2023 #1

我建议启用警告。如果您使用 gcc use,这将迫使您删除所有警告,否则程序将无法编译。-Wall -Wextra -Werror

当你编译你的程序时,你会得到:

<source>:5:5: warning: 'n' is used uninitialized [-Wuninitialized]
    5 |     int arr[n];
      |     ^~~

这意味着您需要先分配一些值(例如,通过使用 )。否则,您的代码将调用未定义的行为,并且无法预测您的代码的行为。scanf

还要始终检查结果scanf

int main(void){
    int n; 
    if(scanf("%d",&n) == 1)
    {
        int arr[n];
        
        for(int i = 0; i<n;i++){
            if(scanf("%d",&arr[i]) != 1) 
            {
                printf("Error scanning the value at index %d. Exiting\n", i);
                return 1;
            }
        }
        for(int x = 0; x<n;x++){
            printf("%d",arr[x]);
        }
    }
    return 0;
}

https://godbolt.org/z/Y481vcM1c

评论

0赞 chqrlie 8/29/2023
我可以建议吗?printf("%d\n", arr[x]);
0赞 0___________ 8/29/2023
@chqrlie我正在考虑它,但我不确定这是否是 OP 想要的
2赞 paulsm4 8/29/2023
我同意“始终启用完整警告”。对于 GCC,我鼓励.另外:我认为鼓励开发人员认识到“调试器是他们的朋友”非常重要。尽早学习他们的调试器,并经常使用它。恕我直言......-Wall -Wextra -pedantic
1赞 0___________ 8/29/2023
@paulsm4 我会认为迂腐,因为坚持 40 年的标准是没有意义的
0赞 chqrlie 8/29/2023
目前尚不清楚 OP 是什么意思,我尝试在第二次扫描中添加一个 \\n 字符......在格式中添加 A 需要在末尾进行额外的输入,但不应导致 A 出现在输出中。\nscanf()\