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

时间:2015-05-16 12:35:18

标签: c

假设我有一个名为books的结构,同时包含字符串和int变量

我想做以下事情:

  1. 打印存储在变量中的实际值。
  2. 提供插入新值的选项。
  3. 如果用户按下“输入”,则值保持不变。
  4. 我尝试使用scanf执行此操作,但无法接收空输入。如果是的话,我可以这样做:

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

    与字符串类似,但使用strcpy()函数分配新值。

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

    感谢任何帮助。

3 个答案:

答案 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键),变量numbername的值不会改变