使用scanf读取整数直到换行符

3

我对C语言很陌生,之前用的是Java,所以有些东西不太熟悉... 我想读取无限数量的整数直到遇到换行符。我知道换行符是/n,我已经有了一段代码,可以读取输入的整数,但是如果有换行符它就不会停止。

#include <stdio.h>

int main() {

int i, numberOfNumbs=0,total=0,value, valsRead;
float average;

valsRead = scanf("%d",&value);

while(valsRead>0)
{
numberOfNumbs++;
total +=value;
printf("Read %d\n", value);
valsRead = scanf("%d",&value);
}

average=(float)total/(float)numberOfNumbs;
printf("You read %d values. Average = %f.",numberOfNumbs, average);

return (0);
}

输入应该像这样: 23 4 114 2 34 3224 3 2 ⁄n 提前感谢。

fgets() 不是只用于文件吗?我想从终端读取... 如果我错了,对不起 :O - bli77
3
stdin 是一个文件或流。它是默认的控制台输入,并已经“打开”。 - Weather Vane
3个回答

4

scanf设计上不以行为单位的。它旨在处理以空格分隔的输入,其中空格可以是任何组合,包括空格、制表符、\r 或 \n。

如果您想要使用以行为单位的输入,应该使用 fgets 将一整行读入字符串,然后使用 strtok 和 sscanf 解析字符串。代码可能如下:

#include <stdio.h>
#include <string.h>

/* maximum size of an input line : adapt to your needs */
#define SIZE 256

int main() {

    int i, numberOfNumbs=0,total=0,value, valsRead;
    float average;
    char line[SIZE], *val;
    char delims[] = " \t\r\n";

    if (fgets(line, SIZE, stdin) == NULL) { /* EOF */
        fprintf(stderr, "No input\n");
        return 1;
    }
    if (line[strlen(line) - 2] != '\n')  {/* line too long */
        fprintf(stderr, "Line too long\n");
        return 2;
    }
    val = strtok(line, delims);
    valsRead = sscanf(val, "%d",&value);

    while(valsRead>0)
    {
        numberOfNumbs++;
        total +=value;
        printf("Read %d\n", value);
        val = strtok(NULL, delims);
        valsRead = (val == NULL) ? 0 : sscanf(val, "%d",&value);
    }

    average=(float)total/(float)numberOfNumbs;
    printf("You read %d values. Average = %f.",numberOfNumbs, average);

    return (0);
}

如果我尝试编译它,编译器会给我一些错误:/ - bli77
@bli77:现在应该好多了 - 看起来我应该先尝试编译一下;-) - Serge Ballesta
谢谢,它有效果^^虽然我不得不注释掉了关于“行太长”的if循环,因为否则无论你输入什么都会出错。 - bli77
注意:line[strlen(line) - 2] 可能会导致 line[-1] 或极少数情况下的 line[-2],从而引起问题。建议使用 line[strcspn(line, "\r\n")] = 0; - chux - Reinstate Monica

1

如果你想要多个值,最好使用数组, 同时,如果想要在输入新行之前输入值,则可以使用scanf("%[^\n]", string);


1
我建议您从键盘输入一个字符串来实现您想要做的操作。
char string[100];

scanf("%s",string)

然后,您可以通过查找数字的字符串来工作,例如使用命令。
sscanf(string,"%d",&integer)

这里的棘手之处在于,当你得到第一个整数后,你需要找出第一个空格你的数字之后的位置。假设它距离开头n个字符,那么你可以重复这个过程。
sscanf(string+n,"%d",&integer)

并测试sscanf的值,以查看是否正确读取了某些内容。

这不是一个完整的答案,而是建议采用不同的策略。

我通常从文件中读取这样的内容,但在这里你必须小心,因为对于文件,行结束字符可以是ascii代码10、13或unix、mac和msdos格式文件的10和13(抱歉,我记不清哪个是哪个了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接