我正在编写一个简单的代码来获取用户的输入。这是我的代码:
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键时,我的代码仍然等待所有其他输入被插入,一旦全部插入,它将检查所有条件,使所有打印,然后结束。
出什么问题了?
答案 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;
}