当我按下键盘上的 Enter 时,我正在进行一项需要输入数字列表并获得输出的作业。这是我输入时用于获取数字列表的代码,但它不起作用:
#include <stdio.h>
int main(){
int arra[100];
int i ;
int j = -1;
while (scanf("%d",&i) != 1){
arra[++j] = i;
}
printf("\n");
int k;
for(k = 0; k < j; k++){
printf("%d",arra[k]);
}
return 0;
}
我想打印arra
。
答案 0 :(得分:6)
首先,大量的赞誉用于测试来自scanf
的返回值,大多数人只是盲目地认为它有效。你以错误的方式使用它只是一种耻辱: - )
只要返回值为1
,您就希望循环继续,这意味着您设法扫描整数。这意味着它应该是:
while (scanf ("%d", &i) == 1) {
这也意味着任何非数字输入都会导致扫描失败,因此while
循环将退出。所以,如果你输入:
3 1 4 1 5 9 stop
您应该成功查看数组中的数值。
唯一的另一件事是清理j
处理,因为k
循环会提前停止。这可以通过以下方式完成:
for (k = 0; k <= j; k++) {
或者,单独保留该循环,只需更改初始化和修改j
的方式:
int j = 0;
:
arra[j++] = i;
我倾向于发现第二个选择更像C,因为j
是数组中元素的计数而不是最大索引。
当然,你现在可以接受缓冲区溢出攻击了,因为你假设没有人会输入超过一百个数字。所以,不要将它作为一个家庭作业解决方案(你对微小的错误修复你已经足够好)但我倾向于把它写成:
#include<stdio.h>
#define SZ 100
int main (void){
int arra[SZ], i, nxt = 0;
while ((nxt < SZ) && (scanf ("%d", &(arra[nxt])) == 1))
nxt++;
printf ("\n");
for (i = 0; i < nxt; i++)
printf ("%d ", arra[i]);
return 0;
}
答案 1 :(得分:0)
检查以下代码:
#include<stdio.h>
int main(){
int arra [100];
int i ;
int k;
int j = 0; /* index from 0 */
printf("Keep entering numbers and press q once done \n");
while (scanf("%d",&i) == 1){ /* scan for integers */
arra[j++] = i;
}
printf("\n");
for(k = 0; k < j; k++){
printf("%d",arra[k]);
}
return 0;
}