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

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键时,我的代码仍然等待所有其他输入插入,一旦全部插入,它会检查所有条件,进行所有打印,然后结束。

问题是什么?

最佳答案

使用未初始化的指针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;
}

关于c - scanf和printf没有按顺序执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51561880/

10-16 17:23