簡體   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