C - 两种类型的格式化用户输入,输入数量未知
C - Two types of formatted user input with an unknown number of inputs
我希望用户能够输入两种类型的输入,例如:“C[some size_t]”和“O[some memory address]”,这取决于它是 C 还是 O一开始,我会调用不同的函数。我还希望能够以任何顺序接收未知数量的这些输入。
我的解决方法是这样的:
int main()
{
// variables
while (1) { // Infinite loop to take in multiple unknown amount of inputs?
while (fgets(input, BUFFER_SIZE, stdin)) {
if (sscanf(input, "%c%zu", &branch, &num) == 2) {
if (strcmp(&branch, "C")
// function call
} else if (sscanf(input, "%c%c", &branch, (char *)addr) == 2) {
if (strcmp(&branch, "O")
// function call
}
}
}
return 0;
}
我当然明白为什么它不起作用,我知道我的非解决方案是错误的,但我不知道还有什么办法可以解决这个问题。代码接受第一个输入并挂起,如果我从一个以 O 开头的输入开始,它将进入第一个 if
语句,而这是不应该的。我也不确定我的 while(1)
循环是否是处理多个用户输入的正确方法。
您尝试一次读取 branch
字符和相应的参数——但是两种情况下的参数不同。所以你需要先阅读字符,然后决定,然后只 然后 扫描参数——一旦你知道要扫描什么,从而能够 select 适当的格式化字符串。
正如您刚刚读入的 任何 字符,您可以使用 getc
来更简单一点,顺便说一句:
char branch = getc(); // instead of `if(scanf("%c", &branch) == 1)`
// note: would have been one single scan (branch) only!
if(branch == 'C')
{
// scan num
}
else if(branch == 'O')
{
// scan addr
}
else
{
// error handling
}
或者(我个人更喜欢)
char branch = getc();
switch(branch)
{
case 'C':
// scan num
break;
case 'O':
// scan addr
break;
default:
// error handling
break;
}
请注意,strcmp
需要以 null 结尾的字符串(字符数组)并且不能用于比较单个字符——这些需要通过相等运算符进行比较,见上文。
我希望用户能够输入两种类型的输入,例如:“C[some size_t]”和“O[some memory address]”,这取决于它是 C 还是 O一开始,我会调用不同的函数。我还希望能够以任何顺序接收未知数量的这些输入。
我的解决方法是这样的:
int main()
{
// variables
while (1) { // Infinite loop to take in multiple unknown amount of inputs?
while (fgets(input, BUFFER_SIZE, stdin)) {
if (sscanf(input, "%c%zu", &branch, &num) == 2) {
if (strcmp(&branch, "C")
// function call
} else if (sscanf(input, "%c%c", &branch, (char *)addr) == 2) {
if (strcmp(&branch, "O")
// function call
}
}
}
return 0;
}
我当然明白为什么它不起作用,我知道我的非解决方案是错误的,但我不知道还有什么办法可以解决这个问题。代码接受第一个输入并挂起,如果我从一个以 O 开头的输入开始,它将进入第一个 if
语句,而这是不应该的。我也不确定我的 while(1)
循环是否是处理多个用户输入的正确方法。
您尝试一次读取 branch
字符和相应的参数——但是两种情况下的参数不同。所以你需要先阅读字符,然后决定,然后只 然后 扫描参数——一旦你知道要扫描什么,从而能够 select 适当的格式化字符串。
正如您刚刚读入的 任何 字符,您可以使用 getc
来更简单一点,顺便说一句:
char branch = getc(); // instead of `if(scanf("%c", &branch) == 1)`
// note: would have been one single scan (branch) only!
if(branch == 'C')
{
// scan num
}
else if(branch == 'O')
{
// scan addr
}
else
{
// error handling
}
或者(我个人更喜欢)
char branch = getc();
switch(branch)
{
case 'C':
// scan num
break;
case 'O':
// scan addr
break;
default:
// error handling
break;
}
请注意,strcmp
需要以 null 结尾的字符串(字符数组)并且不能用于比较单个字符——这些需要通过相等运算符进行比较,见上文。