【问题标题】:multiple scanf's use issue多个scanf的使用问题
【发布时间】:2014-12-13 22:13:52
【问题描述】:

我有下面的代码

#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 函数中遇到了一些奇怪的错误: -->在fprintf的最后一次调用中,它没有直接传递到下一行,它要求我输入另一个字符串我不知道该怎么做。scanf函数的多次使用是否有特定的规则?

【问题讨论】:

  • 如果我对每个标记为C 的问题都没有检查scanf 的返回值一美元,那我会非常富有。
  • 我应该在 scanf 返回值中检查什么??
  • @user45232 第一步始终是阅读文档:scanf。在那里你会看到它返回分配的输出项目的数量。如果它不是你所期望的,那么你不应该继续,因为你的变量没有被分配。

标签: c string structure scanf


【解决方案1】:

使用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++;
}

主要问题:scanf(" %d ",&amp;(E[i].Code_confidentiel));"%d" 后面的空格导致scanf 在数字后面继续寻找输入。 " " 告诉继续寻找空白,直到找到后续的非空白。

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

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

" " 通常不需要在大多数说明符之前。所有说明符,预计 %c %n %[ 无论如何都会消耗前导空格。

【讨论】:

  • @user45232 注意:我有点懒。每个fgets() 应该更像if (fgets(buffer, sizeof buffer, stdin) == NULL) break;,因为如果stdin 已关闭,则无需再要求更多数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多