簡體   English   中英

如何掃描 C 中以空格分隔的多個輸入?

[英]How to scanf multiple inputs separeted by space in C?

我是編程新手,我無法解決問題。 所以我必須scanf並檢查它是否是integer(int n),然后讀取n個浮點數(檢查它們是否是浮點數)。 問題是機器測試在輸入中添加了多個由空格分隔的浮點數,我不知道如何獲得這些數字。

我寫了這樣的東西:

  int n;
  if(!scanf("%d", &n)){
    printf("Invalid input");
    return 1;
  }
  float *tab = malloc(n*sizeof(float));
  printf("Enter variables: ");
  for(int i=0; i<n; i++){
    if(scanf("%f", (tab+i))!=1){
      printf("Incorrect input data");
      return 2;
    }
  }

我不知道如果你在輸入中輸入更少或更多的數字,它是否好,該怎么辦。 伙計們,請解釋我這里出了什么問題以及如何解決它。

謝謝你的時間。

如何掃描 C 中以空格分隔的多個輸入?

"%d""%f"將愉快地處理由空格、制表符、行尾等分隔的數字文本,但不區分空格和行尾。 如果一行輸入不足,代碼將讀取下一行的輸入。 如果輸入過多,則不會讀取整行 - rest 為下一個輸入 function 行重復。

如果 OP 關心輸入,最好讀取一行輸入然后解析。

我不知道如果你在輸入中輸入更少或更多的數字,它是否好,該怎么辦。

讓自己負責:如果你指導一個編碼人員團隊,你想要什么? 消費並忽略非數值輸入、消費輸入並報錯、簡單結束代碼等。

除了第一次掃描之外,代碼看起來很合理。

對我來說,對於健壯的代碼,我會刪除所有scanf()並在幫助器 function 中使用fgets()來解析。 然后sscanf()strto*()解析並抱怨如果不符合預期。


樣本

當然,這個助手 function 對於這樣一個簡單的任務來說太過分了,但它是一個助手function - 我可以在任何時候一遍又一遍地使用它來從一行中讀取一組float 我可以根據需要進行改進(例如,更多錯誤句柄、處理過長的行,...)

// Read 1 line of input.
// return EOF on end-of-file or stream error,
// else return number of float read, even if more than N.    
int get_floats(const char *prompt, float *dest, int N) {
  if (prompt) {
    fputs(prompt, stdout);
    fflush(stdout);
  }
  char buf[BUFSIZ];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    return EOF;
  }

  char *endptr = buf;
  int floats_read = 0;

  // parse the line into floats     
  while (*endptr) {
    const char *s = endptr;
    float f = strtof(s, &endptr);
    if (s == endptr) {
      break;  // no conversion
    }
    if (floats_read < N) {
      dest[floats_read] = f;
    }
    floats_read++;
  }

  // Consume trailing white-space
  while ((unsigned char) *endptr) {
    endptr++;
  }
  if (*endptr) {
    return -1;  // Non-numeric junk at the end
  }

  return floats_read;
}

用法:

int n;
if(get_floats("Enter variables: ", tab, n) != n) {
  printf("Invalid input");
  return 1;
}

答案很簡單:在你的 scanf 格式說明符前面放一個空格。 這告訴 scanf 在轉換之前吃掉所有的空白。

像這樣:

#include <stdio.h>
#include <stdlib.h>

int main() {
  int n;

  if (1 != scanf(" %d", &n)) {
    exit(1);
  }
  float *tab = calloc(n, sizeof *tab);
  if (!tab) {
    exit(3);
  }

  for (int i = 0; i < n; ++i) {
    if (1 != scanf(" %f", &tab[i])) {
      exit(2);
    }
  }

  const char *sep = "";
  for (int i = 0; i < n; i++) {
    printf("%s%f", sep, tab[i]);
    sep = ", ";
  }
  printf("\n");

  free(tab);
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM