如何在C中使用数组

时间:2014-10-24 09:30:07

标签: c arrays printf

我在大学开始了我的计算机科学课程,我们正在研究数组。我们必须编写一个读取数据序列的程序,并以相反的顺序打印它。 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;很多时间,然后就崩溃了。

第二个问题是:我是否需要声明数组的大小?

谢谢。

4 个答案:

答案 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