打印一个char数组结束时意外输出

时间:2018-02-07 23:02:09

标签: c arrays

#include <stdio.h>

int main(int argc, const char * argv[]) {
    unsigned char ch,i,letters[95];
    int tapped [0];
    ch=32; //start with 32 (space)

    while(ch<=127){
        ch++;
        letters[i]=ch;
        i++;
    } 
    printf(letters);


    return 0;
}

我正在尝试将32到127的ASCII字符放入一个数组中,这样我就可以在另一个循环中生成N个随机字符。

问题是我要回来所有这些,但我最后还会收到一些额外的意外:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\200\300\367\277_\377

我不明白为什么我最后会得到\ 200 \ 300 \ 367 \ 277_ \ 377,因为他们不在范围内。我是C的新手,所以阵列的某些方面我做得不好吗?

1 个答案:

答案 0 :(得分:4)

首先,如果您将字符数从32计算到127,则其中有96个。因此,letters[96]应使用letters[95]定义,而不是letters

其次,您不应将printf作为第一个参数传递给letters。第一个参数应该是格式字符串,而不是字面打印的字符串。特别是,由于printf包含“%”字符,因此它不是正确的格式字符串。

第三,在打印字符串时,char默认需要以空字符结尾的字符串。要打印非空终止的printf("%.96s\n", letters); 数组,可以在转换说明符中使用精度:

ch

第四,你说你想要所有的字符从32到127,但是你的循环开始于i设置为32并在将它放入数组之前递增它,所以放入数组的第一个值是33你应该把增量推迟到以后。

第五,你没有初始化 struct mydata o { string MY_STRING; int MY_INT; }; 。在开始循环之前必须将其设置为零。