gpt4 book ai didi

c - 在 C 中使用指针

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:49 24 4
gpt4 key购买 nike

我用 c 创建了这个程序。用户键入“lieunaissance”,然后我们打开一个格式化文件来搜索“lieunaissance”值。

我的文件有问题,但现在,我的问题是我的结构 struct departement *recherche_dpt(char recherche_code[]),它总是返回 CODE_NON_TROUVE = 0.

请问我该如何解决?

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<stddef.h>
#include <errno.h>
#define MAX_dpt 100000
#define KEY_NOT_FOND "NOT_FOUND"

/* global statement */
struct departement
{
char currentCode[10];
char oldCode[10];
char name[50];
struct departement *predecesseur ;
struct departement *successeur;
};
struct departement *debut_liste, *fin_liste;
struct departement *undepartement();
void ouvrir_fichier(char Nomfichier[]);
struct departement *search_dpt(char recherche_code[]);
struct departement tabdpt[MAX_dpt];

int main()
{
char sexe, reponse, date[5], annee[3], mois[4], bidon[3],birthPlace[30], ordre[4], struct1[6], struct2[6],nir1[12],nir[13],nir2[13], nirancien[13] ;
int i, namebre, cle, reste,n;
long int val;

struct departement undpt, *pointeur;
char code[10];

scanf("%s",birthPlace);

// convert birthplace uppercase and assign it to name
int k = 0;
while(birthPlace[k])
{
birthPlace[k] = toupper(birthPlace[k]);
k++;
}
printf("%s\n", birthPlace);

// Read in the file
ouvrir_fichier("Basedecommunes.txt");
pointeur=search_dpt(birthPlace);
undpt = *pointeur;

if (strcmp(undpt.currentCode,KEY_NOT_FOND)==0)
{
printf("No ""%s"" has been found \n",birthPlace);
}
else
{
printf("Current code : %s\n",undpt.currentCode);
printf("Old code : %s\n",undpt.oldCode);
printf("Department name : %d\n",undpt.name);
}


void ouvrir_fichier(char Nomfichier[])
{
struct departement *ptmp, *prec, *succ;
FILE *f1;
int nb, lire;

nb=0;
f1=fopen(Nomfichier, "r" );
if (f1 == NULL) {
printf("fopen failed, errno = %d\n", errno);
}
else {
printf("fopen succeeded\n");

while ((! feof(f1)) && (nb < MAX_dpt) )
{
ptmp=undepartement();
if (ptmp != NULL) {

lire=fscanf (f1, "%s %s %s", (*ptmp).currentCode, (*ptmp).oldCode, (*ptmp).name);
printf("lire = %d\n",lire);
if (lire != EOF)
{
(*ptmp).predecesseur=NULL ;
(*ptmp).successeur=NULL;

if (debut_liste == NULL)
{
debut_liste=ptmp ;
fin_liste=ptmp ;
}
else
{
(*fin_liste).successeur=ptmp ;
(*ptmp).predecesseur=fin_liste ;
fin_liste=ptmp ;
}
nb++ ;
}
} else {
printf("malloc error\n");
}
}

}

fclose(f1);
}


/*--- fonction de recherche --- */
struct departement *search_dpt(char dep_name[])
{
struct departement ptmp, *pointeur, *pactu;
int trouve ;

trouve = 0 ;

pointeur=undepartement();

strcpy((*pointeur).currentCode, KEY_NOT_FOND);

pactu=debut_liste ;
while ((! trouve) && (pactu != NULL))
{
ptmp = (*pactu) ;
pactu=(*pactu).successeur ;

trouve=((strcmp(ptmp.currentCode,dep_name))==0) ;

if (trouve)
{
*pointeur=ptmp ;
}
}

return pointeur;

}

/* --- allocation memoire d'une nouvelle structure --- */
struct departement * undepartement(void)
{
struct departement *p = malloc(sizeof *p);
return p;
}

文件内容:

01001   01001   ABERGEMENT-CLEMENCIAT
01002 01002 ABERGEMENT-DE-VAREY
01003 01003 AMAREINS
01004 01004 AMBERIEU-EN-BUGEY
01005 01005 AMBERIEUX-EN-DOMBES
01006 01006 AMBLEON
01007 01007 AMBRONAY
01008 01008 AMBUTRIX
01009 01009 ANDERT-ET-CONDON
01010 01010 ANGLEFORT
01011 01011 APREMONT
01012 01012 ARANC
01013 01013 ARANDAS
01014 01014 ARBENT
01015 01015 ARBIGNIEU
01016 01016 ARBIGNY

最佳答案

在你的代码中,

 strcpy((*pointeur).codeactuel, CODE_NON_TROUVE);

codeactuel 被定义为具有 10 的大小,但要复制 CODE_NON_TROUVE 您需要具有 11< 的大小.

那么,printf(birthPlace);也是错误的,应该是这样的

 printf("%s\n", birthPlace);

还有一个逻辑问题

pointeur=undepartement();

如果 malloc() 失败并且 undepartement() 返回 NULL,您将因取消引用 pointeur 而面临未定义的行为。请添加 NULL 检查。

P.S - 可能还有其他问题。请提供MCVE如果可能的话,请坚持使用英语,以便我们可以更好地理解代码逻辑。

关于c - 在 C 中使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28455081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com