用 scanf 读取 int 直到换行
read int with scanf until new line
我是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
提前致谢
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);
}
如果你想要多个值,那么最好使用数组,
另外,如果在输入新行之前想要值 '\n'
是 scanf("%[^\n]", string);
对于你想从键盘输入的内容,我建议用
读入一个字符串
char string[100];
scanf("%s",string)
然后您可以通过字符串查找数字,例如使用命令
sscanf(string,"%d",&integer)
这里棘手的事情是,在你得到你的第一个整数之后,你需要找出第一个 space 在哪里 在 你的数字之后..说它是开始后 n 个字符,然后你可以用
重复
sscanf(string+n,"%d",&integer)
并测试 sscanf 的值以查看是否正确读入了某些内容。
这不是完整的答案,而是对不同策略的建议。
我做这种从文件中读取的事情,但在这里你必须小心,因为对于文件行尾字符可以是 ascii 代码 10、13 或者 10 和 13 对于 unix,mac 和 msdos 格式文件(对不起,我不记得哪个是哪个了。
我是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
提前致谢
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);
}
如果你想要多个值,那么最好使用数组,
另外,如果在输入新行之前想要值 '\n'
是 scanf("%[^\n]", string);
对于你想从键盘输入的内容,我建议用
读入一个字符串char string[100];
scanf("%s",string)
然后您可以通过字符串查找数字,例如使用命令
sscanf(string,"%d",&integer)
这里棘手的事情是,在你得到你的第一个整数之后,你需要找出第一个 space 在哪里 在 你的数字之后..说它是开始后 n 个字符,然后你可以用
重复sscanf(string+n,"%d",&integer)
并测试 sscanf 的值以查看是否正确读入了某些内容。
这不是完整的答案,而是对不同策略的建议。
我做这种从文件中读取的事情,但在这里你必须小心,因为对于文件行尾字符可以是 ascii 代码 10、13 或者 10 和 13 对于 unix,mac 和 msdos 格式文件(对不起,我不记得哪个是哪个了。