【问题标题】:Char vector saving more than its size字符向量节省超过其大小
【发布时间】:2020-01-05 18:01:38
【问题描述】:

我有一个程序可以读取文件并将其内容保存到结构中:

struct cadastro {
    char cod_segurado[3];
    char nome_segurado[50];
    char seguradora[50];
    char tipo_seguro[30];
};

在读取并保存结构成员 cod_segurado[3] 中的第一个字段后,当程序到达第二个字段时,它会同时保存在第一个和第二个字符中 nome_segurado[ 50] 结构的成员。为什么?

下面的代码显示了我是怎么做的:

while (j < quant_registros){

    fread(&registro,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;

}

所以,最后(例如),结构应该是这样的:

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];hmmm

标签: c file struct archive


【解决方案1】:

一致地缩进你的代码。

这个代码块是错误的

            if(registro[i] != '\0'){
                cadastro[j].cod_segurado[k] = registro[i];
                k++;
            }
            i++;
            conta_caracteres++;

如果第二个字符是'\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); 打印 cod_segurado 使用 printf("%.3s", cadastro[j].cod_segurado); 从而将字符串限制为最多 3 个字符。

我总是很高兴看到这种旧格式仍在使用。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2022-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多