朋友,根據我提供的輸入資料,如何讓 Scanf 取 1 或 2 或 3 個數字?
- 樣本資料 1:“1 2 5”
- 樣本資料 2:“1 4”
- 樣本資料 3:“4”
if(scanf("%lf",&a)==1 )
{
printf("1 input num\n");
}
else if(scanf(" %lf %lf",&a, &b)==2 )
{
printf("2 input num\n");
}
else if(scanf("%lf %lf %lf",&a, &b, &c)==3 )
{
printf("3 input num\n");
}else
{
printf("Error message.\n");
return 1;
}
uj5u.com熱心網友回復:
您可能會認為這是一個答案:
int InputNums=0;
InputNums = scanf("%lf %lf %lf",&a, &b, &c);
if(InputNums!=0)
printf("%d input num\n");
else
printf("Error message.\n");
它的作業原理是不吃一個數字,然后嘗試是否可以讀取更多數字,就像您顯示的代碼那樣。而是嘗試讀取三個數字,然后scanf()告訴您有多少有效。
但實際上我和評論者在一起。如果您的輸入中沒有保證的語法(scanf()用于),請使用其他內容。
這很好地描述了在哪種情況下的替代方案以及如何讓 scanf 在相同的情況下作業:
http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
uj5u.com熱心網友回復:
Scanf 已經為您執行了此操作,并且您確實使用了具有可變數量引數的相同 scanf 函式。您可以在這里查看:vararg 如何在 C 中作業?
但是,您不需要多載 scanf,而是向它傳遞一個字串,告訴您需要掃描的內容。您可以通過在運行時更改字串來動態執行此操作。
要嘗試的代碼如下:
#include <stdio.h>
int main()
{
char one[] = "%d";
char two[] = "%d%d";
int o1;
int t1,t2;
scanf(one,&o1);
scanf(two,&t1,&t2);
printf("%d %d %d",o1,t1,t2);
return 0;
}
uj5u.com熱心網友回復:
如果必須使用scanf()....
"%lf"是一個問題,因為它消耗了包括 在內的前導空白'\n',所以我們丟失了一行輸入可能結束的地方。
相反,首先尋找前導空白并查看是否'\n'發生。
#define N 3
double a[N];
count = 0;
while (count < N) {
// Consume leading white-spaces except \n
unsigned char ch = 0;
while (scanf("%c", &ch) == 1 && isspace(ch) && ch != '\n') {
;
}
if (ch == '\n') {
break;
}
// put it back into stdin
ungetc(ch, stdin);
if (scanf("%lf", &a[count]) != 1)) {
break; // EOF or non-numeric text
}
count ;
}
printf("%d values read\n", count);
for (int i=0; i<count; i ) {
printf("%g\n", a[i]);
}
替代使用僅使用scanf()no 的各種多個前導空格ungetc():
// Consume the usual white spaces except \n
scanf("%*[ \t\r\f\v]");
char eol[2];
if (scanf("%1[\n]", eol) == 1) {
break;
}
如果該行包含多于 N 個數字或非數字文本,則需要更多代碼來報告和處理該問題。
uj5u.com熱心網友回復:
解決scanfand問題的最佳解決方案fscanf通常是使用scanf或以外的東西fscanf。這些確實是非常強大的功能,但也很難成功地用于處理非均勻資料,不僅包括可變資料,還包括可能出錯的資料。他們也有許多怪癖和陷阱,雖然有據可查,但經常讓人們絆倒。
盡管sscanf()與其他兩個共享許多特征,但結果證明在實踐中通常更容易使用。特別是,將一次fgets()讀取一行與sscanf()掃描結果行的內容相結合通常是基于行的輸入的一種方便的解決方法。
例如,如果問題是關于讀取出現在同一行上的一個、兩個或三個輸入,那么人們可能會這樣處理它:
char line[1024]; // 1024 may be overkill, but see below
if (fgets(line, sizeof line, stdin) != NULL) { // else I/O error or end-of-file
double a, b, c;
int n = sscanf(line, "%lf%lf%lf", &a, &b, &c);
if (n < 0) {
puts("Empty or invalid line");
} else {
printf("%d input num\n", n);
}
}
但是請注意,如果任何輸入行超過 1023 個字符,則上述行為可能會令人驚訝。可以解決這個問題,但需要更復雜的代碼。
uj5u.com熱心網友回復:
這是使用 fgets、strtok 和 atof 來實作相同的示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char input[256];
double inputsf[256];
while(1) {
printf(">>> "); fflush(stdout);
char *s = fgets(input, 255, stdin);
if (!s)
break;
int count = 0;
char *t;
while (t = strtok(s, " \n")) {
s = NULL;
inputsf[count ] = atof(t);
}
printf("Found %d inputs\n", count);
for (int i = 0; i < count; i )
printf(" %lf\n", inputsf[i]);
if (count == 0)
break;
}
return 0;
}
基于@chux-ReinstateMonica 評論,這里是一段使用strtod的代碼。它跳過前導空格,但字串末尾的尾隨空格存在問題。所以,那里需要一些額外的檢查,這也可以用于錯誤檢查。下面的回圈可以替換上面的 strtok 回圈。
while(*s) {
char *e;
double val = strtod(s, &e);
if (e == s)
break; // not possible to parse, break the loop
inputsf[count ] = val;
s = e;
}
uj5u.com熱心網友回復:
您可以使用這些代碼行解決您的問題
#include <stdio.h>
int main(){
int a[100];
int n;
printf("How many data you want to input: ");
scanf("%d", &n);
printf("Sample %d data Input: ", n);
for (int i=0; i <n; i ) {
scanf("%d", &a[i]);
}
printf("Sample data %d: ", n);
for (int i=0; i <n; i ) {
printf("%d ", a[i]);
}
if(n == 1){
printf("\n 1 input num\n");
}else if(n==2){
printf("2 input num\n");
}else if(n==3){
printf("3 input num\n");
}else{
printf("Error");
}
return 0;
}
如果您想在單行中進行多個輸入,請使用此行
int arr[100];
scanf ("%lf %lf %lf", &arr[0], &arr[1], &arr[2]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336483.html
下一篇:輸入的微小變化使程式發瘋
