c - 字符向量节省超过其大小
问题描述
我有一个程序可以读取文件并将其内容保存到结构中:
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] != '\0'){
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] != '\0'){
cadastro[j].nome_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
}
j++;
i = 0;
k = 0;
conta_caracteres = 0;
}
所以,最后(例如), struct 就像:
cod_segurado = '001Joao' //why saving Joao if size is 3?
nome_segurado = 'Joao'
seguradora = 'Example'
tipo_segurado = 'Example'
解决方案
一致地缩进你的代码。
这个代码块是错误的
if(registro[i] != '\0'){
cadastro[j].cod_segurado[k] = registro[i];
k++;
}
i++;
conta_caracteres++;
如果第二个字符是 a '\0'
,那么您的代码将从那里脱轨。if 可能会更好,if(k == 0 || cadastro[j].cod_segurado[k - 1] != '\0')
但这不是这个错误。一般来说,我们会将其重写为
cadastro[j].cod_segurado[k] = (k == 0 || cadastro[j].cod_segurado[k - 1] != '\0')
? registro[i]
: 0;
i++;
conta_caracteres++;
以便结构中的 char 数组的其余部分变为零填充。
printf("%s", cadastro[j].cod_segurado);
您使用 Use打印了 cod_segurado,printf("%.3s", cadastro[j].cod_segurado);
从而将字符串限制为最多 3 个字符。
我总是很高兴看到这种旧格式仍在使用。
推荐阅读
- google-apps-script - 在最后一个空行上附加新记录(而不是忽略最后一个空行并在工作表末尾添加新行)
- android - Fab 坐得太低了
- rust - 有没有办法在红豆杉应用程序中获取系统时间/日期?
- ruby-on-rails - ActiveRecord::ConnectionAdapters::SQLite3Adapter 不支持跳过重复项
- excel - Excel Power Query > 从另一个表中添加列
- python - 格式化电话号码
- c# - WPF 启用带有 SQL 条件的按钮
- mysql - Mysql 时间戳和 AUTO_INCREMENT 作为主键
- javascript - 使用到达路由器时如何清除 location.state?
- python - waitKey() 函数不适用于 tkinter