0

我创建了一个非常简单的编码并且没有错误,但是当它运行时,我无法在“年龄”一侧输入。

#include <stdio.h>
#include <conio.h>


struct baby
{
    char name[2][30];
    char sex[2][7];
    char birthday[2][12];
};

struct parents
{
    char nama[2][30];
    int age[2];
};

struct momdad
{
    struct parents father;
    struct parents mother;
};

struct momdad info;
struct baby newborn;

int main()
{
    int i;

    for(i=0;i<2;i++)
    {
        printf("\nEnter baby's name %d: ",i+1);
        gets(newborn.name[i]);

        printf("Enter baby's sex %d (Female/Male): ",i+1);
        gets(newborn.sex[i]);

        printf("Enter baby's birthday %d (dd/mm/yyyy): ",i+1);
        gets(newborn.birthday[i]);

        printf("Enter father's name %d: ",i+1);
        gets(info.father.nama[i]);
        printf("Enter father's age %d: ",i+1);
        gets(info.father.age[i]);

        printf("Enter mother's name %d: ",i+1);
        gets(info.mother.nama[i]);
        printf("Enter mother's age %d: ",i+1);
        gets(info.mother.age[i]);



    }

    printf("\n\n\tNEW BORN BABY IN KUANTAN HOSPITAL");
    printf("\n\n===============================================");

    for(i=0;i<2;i++)
 {


        printf("\n\nBaby name: %s",newborn.name[i]);
        printf("\nSex: %s",newborn.sex[i]);
        printf("\nBirthday: %s",newborn.birthday[i]);
        printf("\n\nFather name: %s",info.father.nama[i]);
        printf("\nFather age: %s",info.father.age[i]);
        printf("\n\nMother name: %s",info.mother.nama[i]);
        printf("\nMother age: %s",info.mother.age[i]);
        printf("\n\n----------------------------------------------");
 }

    getch();
}

这是我认为是错误的声明,但我不知道该怎么做。

int age[2];

输入将放在这里

printf("Enter father's age %d: ",i+1);
gets(info.father.age[i]);

n 在这里

printf("Enter mother's age %d: ",i+1);
gets(info.mother.age[i]);

我还是编程新手抱歉问了这个简单的问题

4

1 回答 1

0

永远不要使用gets(). 它不能安全使用,并且从 2011 年起,它已从语言中删除。

在评论中,您提到 call fflush(stdin);。的行为fflush对于输入流是未定义的。一些实现定义了行为,但取决于这将使您的程序不可移植——而且您也不需要它。

读取输入数据的最简单方法是使用scanf(),但这有其自身的一些问题。例如,如果您使用scanf("%d", &n);and 键入123,它将消耗123并在其后面留下任何内容(例如换行符)等待读取。

读取输入的更好方法是使用fgets读取一行文本,然后sscanf从输入行解析数据。它重新

这是一个例子:

#define MAX_LEN 200
char line[MAX_LEN];
int num;

printf("Enter an integer: ");
fflush(stdout);

if (fgets(line, MAX_LEN, stdin) == NULL) {
    fprintf(stderr, "Error reading line\n");
    exit(EXIT_FAILURE);
}
if (sscanf(line, "%d", &num) != 1) {
    fprintf(stderr, "Error parsing integer from line\n");
    exit(EXIT_FAILURE);
}
printf("The number is %d\n", num);

fflush(stdout)在第一个之后调用printf以确保提示实际出现。stdout可以是行缓冲的,这意味着在您打印整行之前不会出现输出。这fflush并不总是必要的,但这是一个好主意。

如果该行长于该行,则该fgets调用将读取一整行输入 MAX_LEN字符。(gets无法指定最大输入大小,因此无论您的目标数组有多大,它总是可以读取更多并破坏随机内存。)fgets如果出现问题,则返回一个空指针,我会检查它。

sscanf类似于scanf,但它从内存中的字符串中读取数据,而不是从标准输入中读取数据。(还有fscanf,它从指定的文件中读取。)它返回成功扫描的项目数,因此 1 以外的值表示错误。

我建议阅读所有这些功能的文档;我没有涵盖他们所做的一切。事实上,您应该阅读您使用的任何标准库函数的文档。

于 2013-10-06T07:04:50.333 回答