无法从用户获得两个输入

时间:2019-12-27 15:04:52

标签: c

我正在练习文件I / O。制作了一个示例程序来从用户那里获取人员数据,并将其作为格式化数据存储在.txt文件中,这样我就可以在内部进行搜索等。

这是我的代码:

typedef struct{
    uchar personelNo[20];
    uchar department[40];
    uchar name[20];
    uchar lastname[20];
}Personel;

void add_personnel() {
    FILE* f = fopen(FILE_NAME, "a+");

    Personel temp;

    check("Enter personel name: ", temp.name, 1);
    check("Enter personel surname: ", temp.lastname, 1);
    check("Enter personel department: ", temp.department, 1);

    fprintf(f, "%d\t%s\t%s\t%s\n", get_last_p_number(f)+1, temp.name, temp.lastname, temp.department);
}

void error_function(const char* buffer, int no_conversions, char *additional_info) {
    fprintf(stderr, "Something went wrong. Here: %s , You entered:\n%s\n", additional_info ,buffer);
    fprintf(stderr, "%d successful", no_conversions);
    exit(EXIT_FAILURE);
}

void check(uchar* print_string, uchar* to_be_written, int buffer_size) {
    int r;

    char temps[BUFF_SIZE];

    fprintf(stdout, "%s", print_string);
    //fflush(stdout);

    if (fgets(temps, BUFF_SIZE, stdin) == NULL) error_function(temps, 0, "fgets");
    if ((r = sscanf(temps, " %s", to_be_written)) != buffer_size) error_function(temps, r, "sscanf");
}

int main()
{
    int selection;

    welcome_screen();

    fprintf(stdout, "%s", "Enter your selection: ");

    scanf(" %d", &selection);

    if (selection == 1) {
        add_personnel();
    }
}

当我尝试运行时,它运行良好,可以得到我的welcome_screen函数,并且当程序要求选择时。但是,当我键入我的选择时,它会立即退出,并显示如下:

Enter personel name: Something went wrong. Here: sscanf , You entered:


-1 successful

是的,我什至无法弄清楚我的错误功能告诉了我什么。有谁知道这是什么问题?我以为是要刷新缓冲区,但是尝试时却无济于事。

*编辑:忘记了添加add_personel函数,现在它在这里。

2 个答案:

答案 0 :(得分:1)

error_function()(r = sscanf(temps, " %s", to_be_written)) != buffer_size时调用

false。您将tempsr"sscanf"传递到error_function(),错误输出表明temps是一个空字符串或仅包含空格,并且{{ 1}}表示在r == -1为空或只有空格的情况下输入失败。

由于使用temps格式说明符进行了更早的scanf()调用,因此出现了问题。当您键入:

%d

1<newline> 仅使用%d位,保留1并在随后的<newline>调用中提取。

为确保您消耗(并丢弃)fgets()项之后的所有非数字字符-读取所有字符,直到selection

<newline>

答案 1 :(得分:0)

通过更改我的检查功能来解决此问题:

void check(uchar* print_string, uchar* to_be_written, int buffer_size) {
    int r;

    char temps[BUFF_SIZE];

    fprintf(stdout, "%s", print_string);
    //fflush(stdout);

    if (fgets(temps, BUFF_SIZE, stdin) == NULL) error_function(temps, 0, "fgets");
    if ((r = sscanf(temps, " %s", to_be_written)) != buffer_size) error_function(temps, r, "sscanf");
}

对此:

void check(uchar* print_string, uchar* to_be_written, int buffer_size) {
    int r;

    fprintf(stdout, "%s", print_string);
    //fflush(stdout);

    if ((r = fscanf(stdin, " %s", to_be_written)) != buffer_size) error_function(stdin, r, "sscanf");
}

它奏效了。 感谢@ user3121023指出不要混用fgetsscanf