字符向量节省超过其大小
Char vector saving more than its size
我有一个读取文件并将其内容保存到结构中的程序:
struct cadastro {
char cod_segurado[3];
char nome_segurado[50];
char seguradora[50];
char tipo_seguro[30];
};
碰巧在读取并保存结构成员 cod_segurado[3] 中的第一个字段后,当程序到达第二个字段时,它同时被保存在结构的第一个和第二个 char nome_segurado[50] 成员。为什么?
下面的代码显示了我的做法:
while (j < quant_registros){
fread(®istro,sizeof(char),TAM_REG_ENTRADA,arquivo);
while(conta_caracteres < TAM_COD_SEGURADO){
if(registro[i] != '[=11=]'){
cadastro[j].cod_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
}
k = 0;
conta_caracteres = 0;
while(conta_caracteres < TAM_NOME_SEGURADO){
if(registro[i] != '[=11=]'){
cadastro[j].nome_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
}
j++;
i = 0;
k = 0;
conta_caracteres = 0;
}
因此,最后(例如)结构如下:
cod_segurado = '001Joao' //why saving Joao if size is 3?
nome_segurado = 'Joao'
seguradora = 'Example'
tipo_segurado = 'Example'
一致地缩进代码。
这个代码块是错误的
if(registro[i] != '[=10=]'){
cadastro[j].cod_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
如果第二个字符是 '[=12=]'
,您的代码从那里开始 rails。 if 可能会像 if(k == 0 || cadastro[j].cod_segurado[k - 1] != '[=13=]')
那样工作得更好,但这不是这个错误。一般来说,我们会将其重写为
cadastro[j].cod_segurado[k] = (k == 0 || cadastro[j].cod_segurado[k - 1] != '[=11=]')
? registro[i]
: 0;
i++;
conta_caracteres++;
以便结构中剩余的 char 数组变为零填充。
您使用 printf("%s", cadastro[j].cod_segurado);
打印了 cod_segurado 使用 printf("%.3s", cadastro[j].cod_segurado);
从而将字符串限制为最多 3 个字符。
看到这种旧格式仍在使用,我总是很高兴。
我有一个读取文件并将其内容保存到结构中的程序:
struct cadastro {
char cod_segurado[3];
char nome_segurado[50];
char seguradora[50];
char tipo_seguro[30];
};
碰巧在读取并保存结构成员 cod_segurado[3] 中的第一个字段后,当程序到达第二个字段时,它同时被保存在结构的第一个和第二个 char nome_segurado[50] 成员。为什么?
下面的代码显示了我的做法:
while (j < quant_registros){
fread(®istro,sizeof(char),TAM_REG_ENTRADA,arquivo);
while(conta_caracteres < TAM_COD_SEGURADO){
if(registro[i] != '[=11=]'){
cadastro[j].cod_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
}
k = 0;
conta_caracteres = 0;
while(conta_caracteres < TAM_NOME_SEGURADO){
if(registro[i] != '[=11=]'){
cadastro[j].nome_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
}
j++;
i = 0;
k = 0;
conta_caracteres = 0;
}
因此,最后(例如)结构如下:
cod_segurado = '001Joao' //why saving Joao if size is 3?
nome_segurado = 'Joao'
seguradora = 'Example'
tipo_segurado = 'Example'
一致地缩进代码。
这个代码块是错误的
if(registro[i] != '[=10=]'){
cadastro[j].cod_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
如果第二个字符是 '[=12=]'
,您的代码从那里开始 rails。 if 可能会像 if(k == 0 || cadastro[j].cod_segurado[k - 1] != '[=13=]')
那样工作得更好,但这不是这个错误。一般来说,我们会将其重写为
cadastro[j].cod_segurado[k] = (k == 0 || cadastro[j].cod_segurado[k - 1] != '[=11=]')
? registro[i]
: 0;
i++;
conta_caracteres++;
以便结构中剩余的 char 数组变为零填充。
您使用 printf("%s", cadastro[j].cod_segurado);
打印了 cod_segurado 使用 printf("%.3s", cadastro[j].cod_segurado);
从而将字符串限制为最多 3 个字符。
看到这种旧格式仍在使用,我总是很高兴。