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

问题描述 投票:1回答:1
#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的新手,所以有些方面的阵列我做得不好吗?

c arrays
1个回答
4
投票

首先,如果你计算从32到127的字符,那么其中有96个。所以letters应该用letters[96]定义,而不是letters[95]

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

第三,在打印字符串时,printf默认需要以空字符结尾的字符串。要打印非空终止的char数组,可以在转换说明符中使用精度:

printf("%.96s\n", letters);

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

第五,你没有初始化i。在开始循环之前必须将其设置为零。

© www.soinside.com 2019 - 2024. All rights reserved.