我想%d
在函数中使用无限类型说明符()scanf()
。
例如-
printf("Enter numbers: \t");
scanf("--%d SPECIFIERS--");
所以不确定有多少。用户将进入。我不希望我的程序询问用户'字符数'..但我想允许任何字符数。但它不可能进入无限%d
。scanf()
那么任何人都可以告诉我找到用户给出的数字平均值的C程序是什么(如果你不知道用户会给出多少数字并且你不希望程序问'多少数字')?
这很棘手。2 种方法
1 -fgets()
读取 1 行,然后解析
char buffer[1000];
int count = 0;
double sum = 0;
int num;
fgets(buffer, sizeof buffer, stdin);
const char *p = buffer;
int n;
while (sscanf(p, "%d%n", &num, &n) == 1) {
p += n;
; // do something with `num`
sum += num;
count++;
}
printf("Average %f\n", sum/count);
2 - 假设您无限输入以行尾结束。现在的问题是这%d
将消耗所有前导空格,包括\n
. 因此我们需要预先消耗和测试所有的空白
int count = 0;
double sum = 0;
int num;
for (;;) {
int ws = 0;
while (isspace(ws = fgetc(stdin)) && (ws != '\n'));
if (ws == '\n') break;
ungetc(ws, stdin);
if (scanf("%d", &num) != 1) break;
; // do something with num
sum += num;
count++;
}
printf("Average %f\n", sum/count);
如果您真的对无限数量的输入感兴趣,那就试试这个
while(1)
{
printf("Enter numbers: \t");
scanf("%d", number);
}
在您强行关闭程序之前,它将需要输入!
但是这样做有什么意义吗?
如果用户输入始终是由空格分隔的数字,那么最后是输入(换行符)。然后你可以使用下面的代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int input;
char c;
while (scanf(" %d%c", &input, &c) == 2 ) {
printf("number is %d\n", input);
if ( c == '\n') break;
}
}
如果用户想将输入的数量作为参数进行交流
int main(int argc, char *argv[])
{
int number_of_input = atoi(argv[1]);
int input, i;
for (i=0; i<number_of_input; i++) {
scanf(" %d", &input);
}
}
当你打电话给你的程序。你这样称呼它:
$ myprogram 5
5 这里是你可以输入的整数个数
myprogram
将保存在argv[0]
5
将保存在argv[1]
myprogram
并5
在argv[]
数组中保存为 sting。atoi(argv[1])
将"5"
as 字符串转换5
为整数
您也可以通过这种方式让用户输入一个无限整数输入:
int main(int argc, char *argv[])
{
int input, i;
while (1) {
scanf(" %d", &input);
}
}
你可以给用户一种方法来停止这个无限循环:
int main(int argc, char *argv[])
{
int input;
while (scanf(" %d", &input) != EOF) {
//....
}
}
在这里你可以停止无限循环
EOF = CTRL+ D(对于 Linux)
EOF = CTRL+ Z(对于 Windows)
初读时,此类问题的解决方案是循环直到用户输入“完成”字符。例如,这可能是一封信Q
。通过将输入作为字符串读取,您可以同时处理数字和字母。下面的代码一次处理一个输入(后跟) - 可以退出(终止程序)或清除(重新开始计算,保持程序运行):
printf("Enter numbers to average. Type Q to quit, or C to clear calculation.\n");
char buf[256];
double sum=0, temp;
int ii = 0;
while(1)
{
printf("Input: \t");
fgets(buf, 255, stdin);
if (tolower(buf[0])=='q') break;
// allow user to "clear" input and start again:
if (tolower(buf[0])=='c') {
sum = 0;
ii = 0;
printf("Calculation cleared; ready for new input\n");
continue;
}
ii++;
sscanf(buf, "%lf", &temp);
sum += temp;
printf("At this point the average is %lf\n", sum / (double)ii);
}
printf("Done. The final average of the %d numbers is %lf\n", ii, sum / ii);
编辑在对此和其他答案的评论中反复讨论之后,这是一个解决您的问题的解决方案。代码已经过测试——它可以编译、运行并给出预期的结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
double sum=0;
int ii=0;
char buf[256], *temp;
char *token;
printf("Enter the numbers to average on a single line, separated by space, then press <ENTER>\n");
fgets(buf, 255, stdin);
temp = buf;
while((token=strtok(temp, " ")) != NULL) {
temp = NULL; // after the first call to strtok, want to call it with first argument = NULL
sum += atof(token);
ii++;
printf("Next token read is number %d: '%s'\n", ii, token); // so you see what is going on
// remove in final code!!
}
printf("AVERAGE: ***** %lf *****\n", sum / (double)ii);
return 0;
}
再进行一次编辑如果您想getline
改用(您在评论中询问过 - 它甚至比fgets
它会根据需要增加缓冲区大小更安全),您可以稍微更改一下代码。我只是给出了一些相关的行 - 你可以弄清楚其余的,我敢肯定:
double sum=0;
char *buf, *temp; // declaring buf as a pointer, not an array
int nBytes = 256; // need size in a variable so we can pass pointer to getline()
buf = malloc(nBytes); // "suggested" size of buffer
printf("Enter numbers to average on a single line, separated with spaces\n")
if (getline(&buf, &nBytes, stdin) > 0) {
temp = buf;
// rest of code as before
}
else {
// error reading from input: warn user
}
我相信你可以从这里弄清楚...
您应该有某种方式知道输入在哪里结束。它有很多方法,每种方法都有可能不同的解决方案。最常见的两个是:
解决方案是读取一行,然后解析该行以获取您的数字,直到该行结束。
这样做的好处是程序可以在之后为程序的其他部分请求其他输入。缺点是用户必须在同一行中输入所有数字。
简单地循环,读取一个数字直到文件结束:
while (scanf("%d", &num) == 1)
/* do something with num */
注意:用户可以在 Linux 控制台中使用Ctrl+输入文件结尾D