假设我有一个名为books
的结构,同时包含字符串和int变量。
我想做以下事情:
我尝试使用scanf
执行此操作,但无法接收空输入。如果是的话,我可以这样做:
printf("Current value: %d New value: ",books.intVar);
scanf("%d",aux);
if (aux) {
books.intVar = aux;
}
与字符串类似,但使用strcpy()
函数分配新值。
我很确定此问题的解决方案是gets()
和sscanf()
的组合,但我不知道如何使用它们来获取我正在寻找的结果。< / p>
感谢任何帮助。
答案 0 :(得分:2)
您可以改为使用fgets()
,就像这样
char line[100];
int value;
if (fgets(line, sizeof(line), stdin) != NULL)
{
if (line[0] == '\n')
handleEmptyLine();
else
{
value = strtol(line, NULL, 10);
fprintf(stdout, "New Value: %d\n", value);
/* Do whatever you want with value */
}
}
虽然相同的代码可能适用于gets()
,但这是一件非常糟糕且不必要的事情,因为你可能会因gets()
而无法限制输入长度而导致缓冲区溢出,而fgets()
允许您设置目标缓冲区长度的最大值。
您应该注意fgets()
确实读取了输入末尾的'\n'
字符,您可以方便地使用该字符检查该行是否为空,尽管它是空的。还不够,因为空行也可能是一堆空白字符,所以line[0] == '\n'
测试只有在用户只按 Enter / 返回时才有效关键,因此做一些像
char buffer[100];
char *line;
int value;
if ((line = fgets(buffer, sizeof(buffer), stdin)) != NULL)
{
while ((line[0] != '\0') && (isspace((int) line[0]) != 0))
line++;
if (line[0] == '\0')
handleEmptyLine();
else
{
value = strtol(line, NULL, 10);
fprintf(stdout, "New Value: %d\n", value);
/* Do whatever you want with value */
}
}
答案 1 :(得分:0)
使用fgets()
代替scanf()
。如果您想捕获空输入,可以将其与'\n'
进行比较。
答案 2 :(得分:0)
我刚刚找到了一个更短更简单的方法来做同样的事情@iharob建议:
char aux[100];
// Sample data:
char name[100];
int number = 250;
strcpy(name,"Sample name");
// Interger case:
gets(aux);
sscanf(aux,"%d",number);
// String case:
gets(aux);
sscanf(aux,"%s",name);
当程序要求输入int或字符串而我们不提供它时(按Enter键),变量number
和name
的值不会改变