[英]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.