C:正确使用fgets和sscanf。虽然做得不对

时间:2013-08-31 20:57:47

标签: fgets scanf

所以,首先,对所有那些无视我的澄清请求并特别强调那些傲慢地对这个问题负面评价的人表示感谢。我可以告诉你,我获得的大学学位比你们许多人的学位要多。

Stackoverflow的声誉是对正在学习新事物的人们进行obnoxius微观管理。他们对你的动作和问题的每一点进行微观调控,并惩罚你,以便给自己一些指控。

这是工作代码

#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();

}

1 个答案:

答案 0 :(得分:0)

好吧,其他人帮我解决了这个问题。没有办法在互联网上找到可靠的完整解释。

因此。我们将始终使用fgets读取,但如果我们正在读取字符串或整数或长整数,那么我们继续的方式会有所不同。

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

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

此外,Schwartz对此感到愤怒:在fgets之后阅读时sscanf中的语法。它有3个参数,从stdin读入的参数自然必须具有与存储它的变量不同的变量。

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

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

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

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

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

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