如何使用 scanf 或使用不同的输入读取方法?
How to use scanf or use a different input reading method?
C 的新手,有点挣扎。
我正在读取如下所示的输入:
9, 344, 100
10, 0, 469
...
我正在尝试对每一行进行分组,以便我可以将每 3 个数字作为函数中的参数发送。
我一直在尝试使用 scanf
,但因为它映射到内存地址,所以我在保留每一行后的数字时遇到了问题。我不知道我会有多少行数据,所以我不能制作一定数量的数组。另外,我仅限于 <stdio.h>
.
中的函数
如果我使用 scanf
是否可以避免使用 malloc?
我在下面附上了一个想法。寻求建议,也许可以澄清一下 scanf
的工作原理。
抱歉,如果我在这里遗漏了一些明显的东西。
int main() {
int i = 0;
int arr[9]; //9 is just a test number to see if I can get 3 lines of input
char c;
while ((c = getchar()) != EOF) {
scanf("%d", &arr[i]);
scanf("%d", &arr[i + 1]);
scanf("%d", &arr[i + 2]);
printf("%d, %d, %d\n", arr[i],
arr[i + 1], arr[i + 2]); //serves only to check the input at this point
//at this point I want to send arr 1 to 3 to a function
i += 3;
}
}
这段代码的输出是一堆内存地址和一些正确的值穿插其中。
像这样:
0, 73896, 0
0, 100, -473670944
什么时候应该读作:
0, 200, 0
0, 100, 54
int main(){
char c;
while ((c=getchar()) != EOF){
if (c != '\n'){
int a;
scanf("%d", &a);
printf("%d ", a);
}
printf("\n");
}
}
此代码正确打印出输入,但不允许我在没有内存问题的情况下在 while 块中多次使用 scanf
。
我宁愿使用 fgets
和 sscanf
。
char buff[64];
/* .......... */
if(fgets(buff, 63, stdin) != NULL)
{
if(sscanf(buff, "%d,%d,%d", &arr[i], &arr[i + 1], &arr[i + 2]) != 3)
{
/* handle scanf error */
}
}
else
{
/* handle I/O error / EOF */
}
一个选项是同时扫描所有三个。您还需要匹配输入中的逗号 (,
)。
示例:
#include <stdio.h>
int main() {
int arr[9];
int i = 0;
for(; i + 3 <= sizeof arr / sizeof *arr // check that there is room in "arr"
&& // and only then, scan:
scanf(" %d, %d, %d", &arr[i], &arr[i+1], &arr[i+2]) == 3;
i += 3)
{
printf("%d, %d, %d\n", arr[i], arr[i+1], arr[i+2] );
}
}
C 的新手,有点挣扎。
我正在读取如下所示的输入:
9, 344, 100
10, 0, 469
...
我正在尝试对每一行进行分组,以便我可以将每 3 个数字作为函数中的参数发送。
我一直在尝试使用 scanf
,但因为它映射到内存地址,所以我在保留每一行后的数字时遇到了问题。我不知道我会有多少行数据,所以我不能制作一定数量的数组。另外,我仅限于 <stdio.h>
.
如果我使用 scanf
是否可以避免使用 malloc?
我在下面附上了一个想法。寻求建议,也许可以澄清一下 scanf
的工作原理。
抱歉,如果我在这里遗漏了一些明显的东西。
int main() {
int i = 0;
int arr[9]; //9 is just a test number to see if I can get 3 lines of input
char c;
while ((c = getchar()) != EOF) {
scanf("%d", &arr[i]);
scanf("%d", &arr[i + 1]);
scanf("%d", &arr[i + 2]);
printf("%d, %d, %d\n", arr[i],
arr[i + 1], arr[i + 2]); //serves only to check the input at this point
//at this point I want to send arr 1 to 3 to a function
i += 3;
}
}
这段代码的输出是一堆内存地址和一些正确的值穿插其中。 像这样:
0, 73896, 0
0, 100, -473670944
什么时候应该读作:
0, 200, 0
0, 100, 54
int main(){
char c;
while ((c=getchar()) != EOF){
if (c != '\n'){
int a;
scanf("%d", &a);
printf("%d ", a);
}
printf("\n");
}
}
此代码正确打印出输入,但不允许我在没有内存问题的情况下在 while 块中多次使用 scanf
。
我宁愿使用 fgets
和 sscanf
。
char buff[64];
/* .......... */
if(fgets(buff, 63, stdin) != NULL)
{
if(sscanf(buff, "%d,%d,%d", &arr[i], &arr[i + 1], &arr[i + 2]) != 3)
{
/* handle scanf error */
}
}
else
{
/* handle I/O error / EOF */
}
一个选项是同时扫描所有三个。您还需要匹配输入中的逗号 (,
)。
示例:
#include <stdio.h>
int main() {
int arr[9];
int i = 0;
for(; i + 3 <= sizeof arr / sizeof *arr // check that there is room in "arr"
&& // and only then, scan:
scanf(" %d, %d, %d", &arr[i], &arr[i+1], &arr[i+2]) == 3;
i += 3)
{
printf("%d, %d, %d\n", arr[i], arr[i+1], arr[i+2] );
}
}