[英]Capture enter as an input (for int and char variables)
假設我有一個名為books
的結構,包含string和int變量 。
我想做以下事情:
我嘗試用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鍵),變量number
和name
的值不會改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.