我有一个while循环,它接受用户输入,直到用户说退出,但我不确定如何正确地声明字符串。如果用户只输入一个单词,则第二个变量将保持与前一个循环相同的值。
int main(int argc, char * argv[]){
char user_input[25];
char var1[25], var2[25];
while(strcmp(var1, "quit") != 0){
clear_buffer(user_input);
fgets(user_input, 30, stdin);
sscanf(user_input, "%s %s", var1, var2);
do_stuff(var1, var2);
}
printf("%s", "Done\n");
发布于 2015-04-08 23:52:28
我不确定如何正确地声明字符串
字符串不是一种类型。它们是一种值模式,与其他值一样,我们不声明它们;而是赋值(在本例中,使用strcpy
和其他函数)。如果你说一个int
存储的是10的倍数,那么它以0结束...如果您说一个char
数组存储了一个字符串,那么它将在第一个'\0'
结束。你看到模式了吗?我们可以在不同类型的整数变量中存储十的倍数,同样,对于字符串,我们可以选择不同类型的字符数组。类似地,对于在integer
变量中存储数值,当声明一个数组来存储字符串时,您需要确保该数组有足够的空间来存储字符串的所有字符以及末尾的'\0'
。
如果用户只输入一个单词,则第二个变量将保持与前一个循环相同的值。
检查sscanf
的返回值。
例如,在考虑int x = sscanf(user_input, "%s %s", var1, var2);
时,您可能希望确保给sscanf
的两个参数都被赋值,在这种情况下,您将检查该x == 2
。如果你只关心第一个参数的赋值,那么当x == 1
时你也会很高兴。但是,如果为x <= 0
,则不能信任var1
或var2
发布于 2015-04-08 22:44:43
多个问题
var1
,但你使用的是strcmp()
,你需要在尝试使用strcmp()
之前初始化var1
,如果你想初始化为一个空字符串var1 =‘\0’;
30
传递给fgets()
,但user_input
只能保存25
字符。现在来看看为什么程序是这样运行的,你需要检查sscanf()
是否读取了两个字符串,如果没有,它不会改变传递的参数。
scanf()
函数返回与输入匹配的说明符的数量,因此如果
scanf()
返回initialized/modified.scanf()
,这意味着两个参数都不是initialized/modified.0
1
都已初始化/修改,然后它将返回2
,因此检查这一点可以让您知道出了什么问题,并且您可以打印输入字符串以验证scanf()
是否正确,输入是否错误。发布于 2015-04-08 22:59:36
char user_input[50+1];
char var1[25], var2[25];
while(fgets(user_input, sizeof(user_input), stdin)){
int state = sscanf(user_input, "%24s %24s", var1, var2);
if(state == 1 && strcmp(var1, "quit") == 0)
break;
else if(state == 2)
do_stuff(var1, var2);
}
https://stackoverflow.com/questions/29526612
复制