-2

这是工作代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct birthdate{
        int day;
        int month;
        int year;
        }birthdate_t;

typedef struct contacto {
        char name[30];
        long telephone;
        birthdate_t bd;  // es decir, bd es de tipo struct
        } contacto_t;

/* create the prototypes. Otherwise it does not work! */
contacto_t create_contact(void);
birthdate_t create_birthdate(void);

        contacto_t create_contact(){ // it returns a structure type
        contacto_t c1; // creates actually a blank structure y aquí abajo le meto datos

        printf("Enter name: ");
        fgets(c1.name, sizeof(c1.name), stdin);

        char line[256];
        printf("Enter telephone: ");
        fgets(line, sizeof line, stdin);
        if (sscanf(line, "%ld", &c1.telephone) != 1)
        {
            /* error in input */
        }

        printf("Enter birthdate");
        c1.bd = create_birthdate();
    }


        birthdate_t create_birthdate(){

            birthdate_t bd1;
            char dia[4];
            printf("Enter day: ");
            fgets(dia, sizeof(dia), stdin);
            sscanf(dia, "%d\n", &bd1.day);

            char mes[4];
            printf("Enter month: ");
            fgets(mes, sizeof(mes), stdin);
            sscanf(mes, "%d\n", &bd1.month);

            char anyo[6];
            printf("Enter year: ");
            fgets(anyo, sizeof(anyo), stdin);
            sscanf(anyo, "%d\n", &bd1.year);
            return bd1;
    } // end of birthdate function

main (void)
{
    create_contact();

}
4

1 回答 1

0

我们将始终使用 fgets 进行读取,但如果我们读取的是字符串、整数或长整数,我们进行的方式会有所不同。

读取字符串时,一旦我们使用 fgets 就可以了,不需要使用 sscanf。

如果您正在读取整数,则使用 sscanf 并将其转换为整数。

另外,关于Schwartz 所说的:在 fgets 之后阅读时 sscanf 中的语法。它有 3 个参数,从标准输入读取的参数自然必须具有与存储它的参数不同的变量。

但这非常令人困惑的原因是我在使用 fgets 读取字符串之后也使用了 sscanf,并且还使用了错误的语法,但这并没有产生任何问题,因为一旦 fgets 读取了字符串,编译器就会忽略它,但是尽管使用与我用于没有任何问题的字符串相同的语法,但 sscanf 在读取整数时会出现问题。

复制并粘贴他的正确解释,这里是:

fgets 从给定的流(例如,stdin)中读取一行输入,并将其放入给定的字符串变量(即,一个字符数组)中。

所以如果你只是从一行中读取一个字符串,那么在 fgets 之后就没有什么可做的了。您上一篇文章中的 fgets 将读取的行(包括换行符)放入给定的字符串变量中。

但是,如果您想要一个真正的数值(而不是包含构成该值显示版本的字符的字符串),那么您首先将其作为字符串读取,然后“扫描”字符串以将字符转换为真正的数字。

并且将相同的变量名放在 sscanf 的第一个和最后一个位置是没有意义的。

于 2013-09-02T23:29:37.463 回答