多个scanf的使用问题

时间:2014-12-13 22:13:52

标签: c string structure scanf

我有以下代码

#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," %d\t",E[i].CNE);
        fprintf(fichier,"%s\t",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函数得到一些奇怪的错误: - &gt;在fprintf的最后一次调用中,它没有直接传递给下一行,它要求我输入另一个字符串我不知道该怎么做是否有一个特定的规则来多次使用scanf函数?

1 个答案:

答案 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继续在号码后面查找输入。 " "告诉您继续查找空白区域,直到找到后续的非空白区域。

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

不限制字符串宽度是另一个问题,请使用"%63s"等限制。

在大多数说明符之前通常不需要

" "。所有说明符,期望%c %n %[无论如何都会占用领先的空白区域。