string - scanf问题的更好使用

  显示原文与译文双语对照的内容
0 0

我有密码


#include<stdio.h>
#include<string.h>
#include"gestion.h"
#define N 2



void remplissage_info_etudient(Etudiant *E)
{
 int i;
 FILE *fichier = NULL;
 char *test ; 
 fichier = fopen("test.txt","w");

 if (fichier!= NULL)

{
 fputs("nom des etudients t CNE t CNI t code confidentiel n", fichier) ;

 for(i=0;i<2;i++)
 {
////lectures des infos 
 printf("entrez le nom et le prenom de l'etudient %d: n",i);
 scanf(" %s %s",E[i].nom,E[i].prenom); 
 printf("entrez le CNE de l'etudient %d : n",i);
 scanf(" %d",&(E[i].CNE));
 printf("entrez le CNI de l'etudient %d : n",i);
 scanf(" %s",E[i].CNI);
 printf("entrez le code confidentiel de l'etudient %d : n",i);
 scanf(" %d",&(E[i].Code_confidentiel));
/////ecriture ds le fichier 
 fprintf(fichier," %s %s t",E[i].nom,E[i].prenom);
 fprintf(fichier," %dt",E[i].CNE);
 fprintf(fichier,"%st",E[i].CNI);
 fprintf(fichier,"%d t n",E[i].Code_confidentiel);


 }

 }
 else 
 {
 printf("error") ; 
 }
 fclose(fichier);
}

E 声明为:


typedef struct Etudiant
{
char nom[64];
char prenom[64];
char adresse[64];
int sexe;
char niveau_scolaire[64];
char CNI[64];
int Code_confidentiel;
int CNE;
}Etudiant;

当我使用函数时: remplissage_info_etudient我在fprintf函数中得到了一些奇怪的错误: --> 在最后一次调用时不会直接传递到下一行,并且要求我输入一个不知道的字符串。

时间: 原作者:

0 0

使用 fgets() 读取,检查 sscanf() 结果并限制字符串宽度输入


for(i=0;i<2;)
 char buffer[200];

 printf("entrez le nom et le prenom de l'etudient %d: n",i);
 fgets(buffer, sizeof buffer, stdin);
 if (2!= sscanf(buffer,"%63s%63s",E[i].nom,E[i].prenom)) continue;

 printf("entrez le CNE de l'etudient %d : n",i);
 fgets(buffer, sizeof buffer, stdin);
 if (1!= sscanf(buffer,"%d",&(E[i].CNE)) continue;

 printf("entrez le CNI de l'etudient %d : n",i);
 fgets(buffer, sizeof buffer, stdin);
 if (1!= sscanf(buffer,"%63s",E[i].CNI)) continue;

 printf("entrez le code confidentiel de l'etudient %d : n",i);
 fgets(buffer, sizeof buffer, stdin);
 if (1!= sscanf(bufffer,"%d", &(E[i].Code_confidentiel)) continue;

/////ecriture ds le fichier 
. . .
 i++;
}


主要问题:"%d" 后的空间 scanf(" %d",&(E[i].Code_confidentiel)); 使 scanf 在数字之后继续查找输入。 "" 告知继续查找空白,直到找到后续的non-white-space 。

不检查 scanf() 系列函数会导致麻烦。 检查结果并相应处理。

不限制字符串宽度是另一个问题,使用像 "%63s" 这样的限制。

通常不需要 "" 之前的。 所有的指定者,期望 %c %n %[ 使用前导空格。

原作者:
...