繁体   English   中英

捕获输入作为输入(对于int和char变量)

[英]Capture enter as an input (for int and char variables)

假设我有一个名为books的结构,包含string和int变量

我想做以下事情:

  1. 打印存储在变量中的实际值。
  2. 提供插入新值的选项。
  3. 如果用户按下“Enter”,则值保持不变。

我尝试用scanf做,但它无法接收空输入。 如果是,我可以简单地做:

printf("Current value: %d     New value: ",books.intVar);
scanf("%d",aux);
if (aux) {
     books.intVar = aux;
}

和字符串类似的东西,但使用strcpy()函数来分配新值。

我很确定这个问题的解决方案是gets()sscanf()的组合,但我不知道如何使用它们来获取我正在寻找的结果。

感谢任何帮助。

您可以使用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 / Return键时才有效,因此做类似的事情会更安全

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 */
     }
  }

使用fgets()而不是scanf() 如果要捕获空输入,可以将其与'\\n'进行比较。

我发现了一个更短更简单的方法来做同样的事情@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键),变量numbername的值不会改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM