我在大学开始了我的计算机科学课程,我们正在研究数组。我们必须编写一个读取数据序列的程序,并以相反的顺序打印它。 char'%'声明序列的结束。
这是我写的程序:
#include <stdio.h>
int index;
int x;
int sequence[10];
int main () {
index = 0;
printf("Insert x: ");
scanf("%d", &x);
while (x != '%') {
sequence[index] = x;
printf("Insert x: ");
scanf("%d", &x);
index = index + 1;
}
while (index > 0) {
index = index - 1;
printf("%d", sequence[index]);
}
}
它通过printf读取序列,将每个数字保存在一个数组中,当它接收到&#39;%&#39;时,它开始以相反的顺序打印序列,第二次迭代时。
主要问题是:当我尝试运行它时,在我输入&#39;%&#39;之后出现错误,它开始打印回来&#34;插入x:&#34;很多时间,然后就崩溃了。
第二个问题是:我是否需要声明数组的大小?
谢谢。
答案 0 :(得分:3)
这将扫描一个int。如果成功,则int将被添加到数组中,直到添加了10个整数。如果它无法读取int,则getchar将读取char,如果char为%
,则主循环将退出。如果char不是%
,它将尝试读取另一个int
需要声明数组的大小。
#include<stdio.h>
#include<stdlib.h>
int main() {
int x = 0;
int index = 0;
int sequence[10] = {0};
int ch = 0;
printf ( "Input 10 integers (% to exit)\n");
while ( ch != '%') { // loop until ch is a %
if ( scanf ( "%d", &x) == 1) { // scanf read an int
sequence[index] = x;
index++;
if ( index >= 10) {
break; // too many inputs for array
}
}
else {
ch = getchar(); //scanf failed to read int. read a char and retry
}
}
while (index > 0) {
index = index - 1;
printf("%d\n", sequence[index]);
}
return 0;
}
答案 1 :(得分:0)
根据您的计划。您正在检查while循环中具有整数值的字符。要么像下面那样更改代码,要么将while循环中的条件更改为X!=?哪里?是&#39;%&#39;的ascii值。您可以增加数组大小,但必须声明数组值
#include <stdio.h>
int index;
char x;
char sequence[10]; //you can increase the array size here
int main () {
index = 0;
printf("Insert x: ");
scanf("%c", &x);
while (x != '%' && index <= 10) {
sequence[index] = x;
printf("Insert x: ");
scanf("%c", &x);
index = index + 1;
}
while (index > 0) {
index = index - 1;
printf("%c", sequence[index]);
}
return 0;
}
答案 2 :(得分:0)
崩溃是因为在循环内部没有达到数组最大大小时停止的条件。 在某些时间:index = 10 - &gt; sequence [10]不存在,因为在c索引中必须从0到(数组大小 - 1)。
修改此内容 while(x!='%'){ 对此 while((x!='%')&amp;&amp;(index&lt; = 10)){
关于数组大小声明的问题,答案是YES,必须始终声明数组的大小。
答案 3 :(得分:0)
原因是 scanf(3)会返回使用该格式字符串"%d"
读取的项目数,并且当您不检查该数字时,它会&#39;在你引入%
(这不是一个有效数字)之前得到一个, scanf(3)返回0
(因为它无法将该事物转换为整数)不会从此时开始推进文件指针,一次又一次地读取%
。每次,最后一个读取值被分配给数组的另一个单元格,溢出超过其限制(最后一个元素是9但你允许上升到元素10,再一个),开始写入其他内存和可能会破坏程序。
更改while循环以读取:
while ((scanf("%d", &x) == 1) && (index < 10)) { ...
此外,请使用<
,因为数组是包含10个元素的数组,编号从 0 到 9 。