C 和空字符的数组



我正在做一个由Brian W. Kernighan和Dennis M. Ritchie撰写的关于数组的"C编程语言"一书提出的练习。 该练习需要一个能够接收文本行作为输入并显示超过 80 个字符的文本行的程序。为了方便起见,我在这里定义了最多 3 个输入行,20 作为最大长度,5 作为显示的边框。

该程序运行良好,"printValues"函数允许我查看哪些插入的行超过 5 个字符,但我的好奇心使我看看是否确实将空字符 (/0( 放入向量的未使用空间中。 令我惊讶的是,输出是多种多样的;如果我使用这样的输入:

one
two
helloworld

第一行的输出将是:

nomi[0][0]=o
nomi[0][1]=n
nomi[0][2]=e
nomi[0][3]=
nomi[0][4]=?
nomi[0][5]=
nomi[0][6]=
nomi[0][7]=
nomi[0][8]=
nomi[0][9]=?
nomi[0][10]=c
nomi[0][11]=
nomi[0][12]=
nomi[0][13]=
nomi[0][14]=
nomi[0][15]=
nomi[0][16]=
nomi[0][17]=
nomi[0][18]=
nomi[0][19]=
nomi[1][0]=t
nomi[1][1]=w
nomi[1][2]=o
nomi[1][3]=
nomi[1][4]=
nomi[1][5]=
nomi[1][6]=
nomi[1][7]=
nomi[1][8]=
nomi[1][9]=
nomi[1][10]=
nomi[1][11]=
nomi[1][12]=
nomi[1][13]=
nomi[1][14]=
nomi[1][15]=
nomi[1][16]=
nomi[1][17]=
nomi[1][18]=
nomi[1][19]=
nomi[2][0]=h
nomi[2][1]=e
nomi[2][2]=l
nomi[2][3]=l
nomi[2][4]=o
nomi[2][5]=w
nomi[2][6]=o
nomi[2][7]=r
nomi[2][8]=d
nomi[2][9]=
nomi[2][10]=
nomi[2][11]=
nomi[2][12]=
nomi[2][13]=
nomi[2][14]=
nomi[2][15]=
nomi[2][16]=
nomi[2][17]=
nomi[2][18]=
nomi[2][19]=

进行一些测试后,我意识到仅在第一行中,我在矢量的空单元格中有一些奇怪的字符。 有人可以向我解释一下吗?

对不起我的英语。

#include <stdio.h>
#define MAXNAMES 3
#define MAXNAMESLENGHT 20
#define HIGHERTHAN 5
void printValues(char names[][MAXNAMESLENGHT], char provisionalName[]);
void printIndexs(char names[][MAXNAMESLENGHT]);
int main() {
char names[MAXNAMES][MAXNAMESLENGHT];   
char provisionalName[MAXNAMESLENGHT];
int i, e, c;
for(i = 0; i <= MAXNAMES - 1; i++) {
for(e = 0; e <= (MAXNAMESLENGHT - 2) && (c = getchar()) != EOF && c != 'n'; ++e) {
names[i][e] = c;    
}
names[i][e] = '';
}
printValues(names, provisionalName);
printIndexs(names);
return 0;
}
void printValues(char names[][MAXNAMESLENGHT], char provisionalName[]) {
printf("________________________________________");
printf("nI nomi che superano i %d caratteri sono:n", HIGHERTHAN);
int i, e;
char flag = 'F';
for(i = 0; i <= MAXNAMES - 1; ++i) {
for(e = 0; e <= MAXNAMESLENGHT - 1 && names[i][e] != ''; ++e)
provisionalName[e] = names[i][e];
provisionalName[e] = '';
if(e > HIGHERTHAN) {
flag = 'T';
printf("%sn", provisionalName);
}       
}
if(flag == 'F') printf("nessunon");
}
void printIndexs(char names[][MAXNAMESLENGHT]) {
printf("________________________________________");
printf("nIndici:n");
for(int i = 0; i <= MAXNAMES - 1; ++i) {
for(int e = 0; e <= MAXNAMESLENGHT - 1; ++e) {
if(names[i][e] == 'n')                                 // return (n)
printf("names[%d][%d]=\nn", i, e);
else if(names[i][e] == '')                            // null character ()
printf("names[%d][%d]=\0n", i, e);
else
printf("names[%d][%d]=%cn", i, e, names[i][e]);    // carattere
}
printf("n");
}       
printf("n");
}

在函数内部定义的对象没有限定符(如static(不会自动初始化。(数组是对象。通常,编译器将堆栈用于此类对象(但它们可以使用处理器寄存器,除了简单地使用堆栈之外,还可以进行各种优化(。您在该区域中看到的数据只是以前使用堆栈的剩余数据。(虽然main是 C 程序中执行的第一个例程,但实际上在main之前执行启动代码,以便为程序设置 C 环境。它会在堆栈上留下一些数据。

数组的元素永远不会"为空"。C 没有表示char对象"空"的值。1C 不会自动将数组初始化为"空"或元素中的值为零。当您定义阵列时,您得到的只是保证有可以访问的存储 — 您不能保证该存储中的内容。

脚注

1C 的语义很复杂,在某些情况下,对象的值是未指定的,这意味着不仅它的值不是由 C 的规则确定的,而且程序可能会表现得好像对象没有固定值(每次使用它时它看起来都可能不同(。

相关内容

  • 没有找到相关文章

最新更新