大家好,我有这段代码:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct ficha{
char dni[9];
char nombre[20];
char p_apellido[20];
char s_apellido[20];
char telefono[9];
};
ficha fichas[20]; //creamos array de tipo ficha de 20
ficha aux[20]; //creamos array auxiliar para almacenar datos
int main(){
FILE *fp; //creamos variable tipo file que se llama fp
fp=fopen("datos.txt", "r"); // abrimos en fp el archivo datos.txt con permiso de lectura (r)
if(fp == NULL){
perror("Error al abrir el archivo");
return(-1);
}
else{
char *ptr;
char *tmp;
for (int i =0; i<10; i++){//si hay mas de 10 elementos cambiar 10 por el numero que sea.
fscanf(fp,"%s",aux[i].dni); //almacenando datos de fichero en aux[i]
}
for (int i =0; i<10; i++){
tmp=aux[i].dni;
ptr = strtok(tmp,"; \n");
printf("PTR %i:%s \n",i,ptr);
strcpy(fichas[i].dni, ptr); //almacenando dni en fichas
printf("ficha %i : \n DNI: %s ",i,fichas[i].dni);
printf ("DNIBUENO: %s ", fichas[0].dni);
ptr = strtok(NULL,"; \n"); //te lo hace hasta NULL
printf ("DNIBUENO1: %s", fichas[0].dni);
printf("PTR %i:%s \n",i,ptr);
printf ("DNIBUENO2: %s", fichas[0].dni);
strcpy(fichas[i].nombre, ptr); //almacenando nombre
printf ("DNIBUENO3: %s", fichas[0].dni);
printf("Nombre: %s ",fichas[i].nombre);
printf("auxatope %i:%s \n",i,fichas[0].dni);
ptr = strtok(NULL,"; \n");
printf("PTR %i:%s \n",i,ptr);
strcpy(fichas[i].p_apellido, ptr); //apellido
printf("1 Apellido: %s ",fichas[i].p_apellido);
ptr = strtok(NULL,"; \n");
printf("PTR %i:%s \n",i,ptr);
strcpy(fichas[i].s_apellido, ptr); //2 apellido
printf("2 Apellido: %s ",fichas[i].s_apellido);
ptr = strtok(NULL,"; \n");
printf("PTR %i:%s \n",i,ptr);
strcpy(fichas[i].telefono, ptr); //telefono
printf("Telefono %s \n", fichas[i].telefono);
}
}
fclose(fp);
return 0;
}
我放了很多printf来知道每个时刻的值变量是什么。
当我尝试在我的struct数组中插入nombre(name)时,我的问题开始了,fichas [i] .dni也取名字,当值必须为34567890D时,他的值为34567890DDIEGO。
我不知道它是strtok还是strcpy。有帮助吗?
谢谢!
答案 0 :(得分:1)
你能在这里放一个&#34; datos.txt&#34;允许我测试?
也许问题是&#34; 34567890D&#34;的长度。是9,但你的数组大小只有9.但是你需要有一个de NULL字符的字节(\ 0)。因此,当您打印字符串时,printf不知道何时停止。
第一个strcpy put&#34; 34567890D \ 0&#34;在[i] .dni中,所以nombre的第一个字节是&#39; \ 0&#39;。但是,在那之后,你使用另一个strcpy来删除&#39; \ 0&#39;字符。
那么,你看到如何解决这个问题?
如果dni大小始终为9,则必须具有大小为10的数组, 否则,你必须限制dni字符串的大小,它不超过大小(lenght - 1)
祝你有个美好的一天。