scanf和printf没有按顺序执行

时间:2018-07-27 16:18:41

标签: c printf scanf

我正在编写一个简单的代码来获取用户的输入。这是我的代码:

int main() {

    char *start = NULL;
    char *end = NULL;
    char in, out, shift;

    while (strcmp(start, "acc") != 0) {
        printf("before start");
        scanf("%ms ", &start);

        if(strcmp(start, "acc") != 0) {
            printf("in if");
            scanf("%c %c %c %ms", &in, &out, &shift, &end);
            printf("%s", start);
            printf("%c", in);
            printf("%c", out);
            printf("%c", shift);
            printf("%s", end);
        }
    }
}

输入总是这样的:

string char char char string

第一个和最后一个任意长度的字符串(这就是为什么我使用%ms的原因)

该代码可以正常工作,并且可以执行其工作,唯一的问题是我想检查我的start字符串是否等于acc,如果是,请跳过这些代码行。

当我在acc中插入scanf("%ms ", &start);并按Enter键时,我的代码仍然等待所有其他输入被插入,一旦全部插入,它将检查所有条件,使所有打印,然后结束。

出什么问题了?

1 个答案:

答案 0 :(得分:2)

使用未初始化的指针start,do / while循环更适合于在使用strcmp测试变量之前允许输入该变量。
我不确定%ms是否为每个调用分配一个新的缓冲区。由于不需要初始化缓冲区,因此我怀疑它会分配新的缓冲区。为避免内存泄漏,请free在需要缓冲区之前和不再需要缓冲区之后。
%ms之后的空格将占用所有尾随空格。要终止扫描,必须输入一些非空白。将该尾随空格移到第​​一个scanf之前的下一个%c

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

int main() {

    char *start = NULL;
    char *end = NULL;
    char in, out, shift;

    do {
        if ( start) {
            free ( start);
            start = NULL;
        }
        printf("before start: ");
        fflush ( stdout);
        scanf("%ms", &start);

        if(strcmp(start, "acc") != 0) {
            if ( end) {
                free ( end);
                end = NULL;
            }
            printf("in if: ");
            fflush ( stdout);
            scanf(" %c %c %c %ms", &in, &out, &shift, &end);
            printf("%s", start);
            printf("%c", in);
            printf("%c", out);
            printf("%c", shift);
            printf("%s", end);
        }
    } while ( strcmp(start, "acc") != 0);

    if ( start) {
        free ( start);
        start = NULL;
    }
    if ( end) {
        free ( end);
        end = NULL;
    }

    return 0;
}