例如,输入为:
12 23 32 41 45
22 11 43
行以'\n'
结尾
我想将数字保存到a[]
和b[]
;
a[] = {12, 23, 32, 41, 45}
b[] = {22, 11, 43}
关键是我不知道每行多少个。
如果我知道第1行n
和第2行m
的数字,我将使用“ for循环”,没问题。
就像,
for(int i = 0; i < n; i++) scanf("%d", a+i);
for(int i = 0; i < m; i++) scanf("%d", b+i);
但是,我不知道n和m,怎么办,伙计们?
答案 0 :(得分:1)
如果您想继续使用scanf方法,我建议使用否定的scanset %[^]
格式说明符。
scanf("%[^\n]", pointerToCharArray)
该字符应读取最多不超过但不包括个指定字符的字符(在我们的示例中为换行符)。如果您要舍弃换行符,请按以下方式阅读:
scanf("%[^\n]\n", pointerToCharArray)
可以在下面找到参考页面的链接。否定的扫描集说明符包括在列表中:
http://www.cplusplus.com/reference/cstdio/scanf/
从这一点出发,使用strtok()将scanf的输出标记为数字数组是一件简单的事情。如果您不熟悉strtok,则在下面提供另一个参考链接:
http://www.cplusplus.com/reference/cstring/strtok/
我希望这会有所帮助!
答案 1 :(得分:0)
让我们使用非标准getline
(通用库扩展)。 @Abbott将 entire 行读入已分配的内存中。
如果需要 array 并在运行时确定其大小,请使用C99和C11中可用的variable length array。
使功能计数并保存数字。使用strto...()
函数进行健壮的解析。
size_t count_longs(char *line, long *dest) {
size_t count = 0;
char *s = line;
for (;;) {
char *endptr;
long num = strtol(s, &endptr, 10);
if (s == endptr) {
break; /// no conversion
}
s = endptr;
if (dest) {
dest[count] = num;
}
count++;
}
return count;
}
示例代码段
char *line = NULL;
size_t len = 0;
ssize_t nread = getline(&line, &len, stdin); // read the whole line
if (nread != -1) {
// successful read
long a[count_longs(line, NULL)]; // determine array size and use a
count_longs(line, a); // 2nd pass: assign array elements.
nread = getline(&line, &len, stdin);
if (nread != -1) {
// successful read
long b[count_longs(line, NULL)];
count_longs(line, b);
// Do something with a and b
}
}
free(line);
len = 0;
答案 2 :(得分:0)
下面的代码可能会满足OP的要求。
该解决方案读取未指定数量的整数并将其存储在arr
中。要中断循环/结束输入,只需输入一个非整数值即可。可以进一步指定搜索特定输入等。
int c = 0;
int *arr = NULL;
int *extArr = NULL;
int i = 0;
for (i = 0; scanf("%d", &c) == 1; i++)
{
extArr = (int*)realloc(arr, (i+1) * sizeof(int));
arr = extArr;
arr[i] = c;
}
free(arr);
但是,我个人会在我提供的解决方案与解决方案答案之间混合使用(如果我不能使用getline
或类似的方法),因为为每个int值重新分配内存对我来说似乎是多余的。
编辑由于存在一些有关我提供的代码以及如何最好地使用它来解决OP的问题的问题。代码片段应该展示如何为未指定数目的整数输入创建自己的scanf样式函数,一次读取一个完整的数组(在这种情况下,free()
必须省略,直到对数组进行一次处理为止) (显然)。