我正在编写一个简单的代码来从用户那里获取输入。这是我的代码:
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/