如何在一次输入中获得多个值?(不确定性数量)
How to get several value in once enter ?(Number of uncertainty)
如何获取从键盘输入的多个值(一个整数类型和多个不确定数)?
我需要编写一个允许用户输入任意数字的程序,
每个数字都由 Space 分隔,当用户按 Enter 键时,
数字被放置在每个变量数组中。
例如,
input number: 1 2 8 9 (Enter) 如果输入第四个(numbers),它会建立四个变量来得到那个值。
编号[0] = 1,编号[1] = 2,编号[2] = 8,编号[3] = 9。
input number: 3 4 7 (Enter) 如果输入第三个(数字),则必须建立三个变量才能得到该值。
编号[0] = 3,编号[1] = 4,编号[2] = 7。
我尝试使用 scan f 功能,但它不起作用,
如果有什么好的建议,请告诉我
#include <stdio.h>
#include <windows.h>
int n, number[10];
main()
{
printf("Enter Number of integer : ");
scanf("%d", &n);
if (n == 1) {
printf("Enter integer : ");
scanf("%d", &number[0]);
} else if (n == 2) {
printf("Enter integer : ");
scanf("%d %d", &number[0], &number[1]);
} else if (n == 3) {
printf("Enter integer : ");
scanf("%d %d %d", &number[0], &number[1], &number[2]);
}
system("pause");
}
看看documentation of scanf。您可以使用函数的 return 值来确定读取整数是否成功。因此你可以做类似
while (scanf("%d") > 0) {
// do stuff
}
这将一次读取一个整数并保存到数字的每个元素。 “%1d”将 scanf 限制为一个字符。有了这个,就没有必要用空格分隔数字了。
#include<stdio.h>
#include<windows.h>
int n,number[10];
int main()
{
int i = 0;
printf("Enter Number of integer : \n");
if ( ( scanf("%d",&n)) == 1)
{
printf ( "Enter integer : \n");
i = 0;
while ( i < n && ( ( scanf ( "%1d", &number[i])) == 1))
{
printf ( "scanned %d into number[%d]\n", number[i], i);
i++;
if ( i >= 10)
{
printf ( "stopping at ten digits\n");
break;
}
}
}
system("pause");
}
您是否考虑过结合使用 scanf()
、fgets()
和 strtok()
?
例如,您可以使用scanf()
来简单查询预期的输入数量。然后使用围绕 `strtok() 的循环来标记用户的输入:
int main()
{
char line[1024];
char *token = {0};
char delim[]={" \r\n\t"};
long telPos = 0;
int count, i;
int *array = {0};
printf("Enter Number of integers, <return> then line of integers : \n");
scanf("%d",&count);
getchar();//eat the newline (from <return>)
while (fgets(line, 1024, stdin) != NULL)
{
array = malloc(sizeof(int)*count);
token = strtok(line, delim);
i = -1;
while(token)
{
if((count - 1) > i++)
{
array[i] = atoi(token);
token = strtok(NULL, delim);
}
else
{
for(i=0;i<count;i++) printf("value %d: %d\n", i, array[i]);
}
}
//do something here with array, then free it.
free(array);
}
return 0;
}
另一种可以提供很大灵活性的替代方法是将输入读取为 个字符 而不是 个数字 。特别是在将单个数字读入数组时。这使您可以完全控制逐个字符地解析输入并以您喜欢的任何方式响应。一个简单的例子:
#include <stdio.h>
#define MAXI 10
int main (void) {
int i = 0;
int c = 0;
int n = 0;
int numbers[MAXI] = {0};
printf ("\n Enter a number: ");
while ((c = getchar()) != EOF && c != '\n')
{
if (c >= '0' && c <= '9')
{
numbers[n] = c - '0';
n++;
if (n == MAXI)
break;
}
}
printf ("\n The numbers entered are: ");
for (i = 0; i < n; i++)
printf ("%d", numbers[i]);
printf ("\n\n");
return 0;
}
例子
$ ./bin/scanf_multi_ints <<<$( printf "01234567890\n" )
Enter a number:
The numbers entered are: 0123456789
$ ./bin/scanf_multi_ints <<<$( printf "0 1 2 3 4 5 6 7 8 9 0\n" )
Enter a number:
The numbers entered are: 0123456789
$ ./bin/scanf_multi_ints
Enter a number: 01234567890
The numbers entered are: 0123456789
$ ./bin/scanf_multi_ints
Enter a number: 01abc234dog5 6 and 7 more 8 dogs 90
The numbers entered are: 0123456789
这里可以用任何方式输入数字。之间有空格。没有。中间有字母或单词。你来决定。从字符到数字的转换是十进制48
(0x30 hex)的简单减法。
最好使用fgets()
。然而,预读 scanf("%d", &some_int)
之前的前导空格也可以。寻找 '\n'
.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
// Scan & toss all white-space. Return 1 on \n or EOF, else return 0
static bool EatWhiteSpaceUntilEOL(FILE *inf) {
int ch;
do {
ch = fgetc(inf);
if (ch == '\n' || ch == EOF)
return true;
} while (isspace(ch));
ungetc(ch, inf);
return false;
}
// Return number of `int` read. Set *eol true if \n or EOF encountered.
size_t Read_int(FILE *inf, int *dest, size_t n, bool *eol) {
for (size_t i = 0; i < n; i++) {
*eol = EatWhiteSpaceUntilEOL(inf);
if (*eol) {
return i;
}
if (fscanf(inf, "%d", &dest[i]) != 1) {
return i;
}
}
*eol = EatWhiteSpaceUntilEOL(inf);
return n;
}
int main(void) {
int n;
printf("Enter maximum number of `int` to read: ");
bool eol;
if (Read_int(stdin, &n, 1, &eol) != 1 || !eol) {
return EXIT_FAILURE;
}
int *a = calloc(n, sizeof *a);
size_t count = Read_int(stdin, a, n, &eol);
printf("Count:%zu First:%d Last:%i Done:%s\n", count, a[0], a[count - 1],
eol ? "Yes" : "No");
free(a);
return 0;
}
如何获取从键盘输入的多个值(一个整数类型和多个不确定数)?
我需要编写一个允许用户输入任意数字的程序, 每个数字都由 Space 分隔,当用户按 Enter 键时, 数字被放置在每个变量数组中。
例如,
input number: 1 2 8 9 (Enter) 如果输入第四个(numbers),它会建立四个变量来得到那个值。
编号[0] = 1,编号[1] = 2,编号[2] = 8,编号[3] = 9。
input number: 3 4 7 (Enter) 如果输入第三个(数字),则必须建立三个变量才能得到该值。
编号[0] = 3,编号[1] = 4,编号[2] = 7。
我尝试使用 scan f 功能,但它不起作用,
如果有什么好的建议,请告诉我
#include <stdio.h>
#include <windows.h>
int n, number[10];
main()
{
printf("Enter Number of integer : ");
scanf("%d", &n);
if (n == 1) {
printf("Enter integer : ");
scanf("%d", &number[0]);
} else if (n == 2) {
printf("Enter integer : ");
scanf("%d %d", &number[0], &number[1]);
} else if (n == 3) {
printf("Enter integer : ");
scanf("%d %d %d", &number[0], &number[1], &number[2]);
}
system("pause");
}
看看documentation of scanf。您可以使用函数的 return 值来确定读取整数是否成功。因此你可以做类似
while (scanf("%d") > 0) {
// do stuff
}
这将一次读取一个整数并保存到数字的每个元素。 “%1d”将 scanf 限制为一个字符。有了这个,就没有必要用空格分隔数字了。
#include<stdio.h>
#include<windows.h>
int n,number[10];
int main()
{
int i = 0;
printf("Enter Number of integer : \n");
if ( ( scanf("%d",&n)) == 1)
{
printf ( "Enter integer : \n");
i = 0;
while ( i < n && ( ( scanf ( "%1d", &number[i])) == 1))
{
printf ( "scanned %d into number[%d]\n", number[i], i);
i++;
if ( i >= 10)
{
printf ( "stopping at ten digits\n");
break;
}
}
}
system("pause");
}
您是否考虑过结合使用 scanf()
、fgets()
和 strtok()
?
例如,您可以使用scanf()
来简单查询预期的输入数量。然后使用围绕 `strtok() 的循环来标记用户的输入:
int main()
{
char line[1024];
char *token = {0};
char delim[]={" \r\n\t"};
long telPos = 0;
int count, i;
int *array = {0};
printf("Enter Number of integers, <return> then line of integers : \n");
scanf("%d",&count);
getchar();//eat the newline (from <return>)
while (fgets(line, 1024, stdin) != NULL)
{
array = malloc(sizeof(int)*count);
token = strtok(line, delim);
i = -1;
while(token)
{
if((count - 1) > i++)
{
array[i] = atoi(token);
token = strtok(NULL, delim);
}
else
{
for(i=0;i<count;i++) printf("value %d: %d\n", i, array[i]);
}
}
//do something here with array, then free it.
free(array);
}
return 0;
}
另一种可以提供很大灵活性的替代方法是将输入读取为 个字符 而不是 个数字 。特别是在将单个数字读入数组时。这使您可以完全控制逐个字符地解析输入并以您喜欢的任何方式响应。一个简单的例子:
#include <stdio.h>
#define MAXI 10
int main (void) {
int i = 0;
int c = 0;
int n = 0;
int numbers[MAXI] = {0};
printf ("\n Enter a number: ");
while ((c = getchar()) != EOF && c != '\n')
{
if (c >= '0' && c <= '9')
{
numbers[n] = c - '0';
n++;
if (n == MAXI)
break;
}
}
printf ("\n The numbers entered are: ");
for (i = 0; i < n; i++)
printf ("%d", numbers[i]);
printf ("\n\n");
return 0;
}
例子
$ ./bin/scanf_multi_ints <<<$( printf "01234567890\n" )
Enter a number:
The numbers entered are: 0123456789
$ ./bin/scanf_multi_ints <<<$( printf "0 1 2 3 4 5 6 7 8 9 0\n" )
Enter a number:
The numbers entered are: 0123456789
$ ./bin/scanf_multi_ints
Enter a number: 01234567890
The numbers entered are: 0123456789
$ ./bin/scanf_multi_ints
Enter a number: 01abc234dog5 6 and 7 more 8 dogs 90
The numbers entered are: 0123456789
这里可以用任何方式输入数字。之间有空格。没有。中间有字母或单词。你来决定。从字符到数字的转换是十进制48
(0x30 hex)的简单减法。
最好使用fgets()
。然而,预读 scanf("%d", &some_int)
之前的前导空格也可以。寻找 '\n'
.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
// Scan & toss all white-space. Return 1 on \n or EOF, else return 0
static bool EatWhiteSpaceUntilEOL(FILE *inf) {
int ch;
do {
ch = fgetc(inf);
if (ch == '\n' || ch == EOF)
return true;
} while (isspace(ch));
ungetc(ch, inf);
return false;
}
// Return number of `int` read. Set *eol true if \n or EOF encountered.
size_t Read_int(FILE *inf, int *dest, size_t n, bool *eol) {
for (size_t i = 0; i < n; i++) {
*eol = EatWhiteSpaceUntilEOL(inf);
if (*eol) {
return i;
}
if (fscanf(inf, "%d", &dest[i]) != 1) {
return i;
}
}
*eol = EatWhiteSpaceUntilEOL(inf);
return n;
}
int main(void) {
int n;
printf("Enter maximum number of `int` to read: ");
bool eol;
if (Read_int(stdin, &n, 1, &eol) != 1 || !eol) {
return EXIT_FAILURE;
}
int *a = calloc(n, sizeof *a);
size_t count = Read_int(stdin, a, n, &eol);
printf("Count:%zu First:%d Last:%i Done:%s\n", count, a[0], a[count - 1],
eol ? "Yes" : "No");
free(a);
return 0;
}