我将按空格分隔的整数输入到二维数组中,如下所示(假设用户输入的值总是超过1且少于10个):
for (i = 0; i < rows; ++i)
{
while (scanf("%d", &arr[i][j++]) == 1)
++j;
}
当我开始一个新行并开始为[i + 1] [j]等分配值时,我想停止将值输入[i] [j]。所以,如果我输入的内容如下:
12 54 2 4
1 2
我的值包含如下:
row 1 = {12, 54, 2, 4}
row 2 = {1, 2}
等
答案 0 :(得分:1)
我建议说使用fgets是诚实的。从来没有真正喜欢scanf。 我会用fgets读取一行,用你的分隔符拆分它。 每当你使用一次fgets迭代时,你应该在下一行。所以相应地使用那个逻辑。
答案 1 :(得分:1)
scanf()
不是“面向行”,并将换行符视为任何其他空格。有多种方法可以满足您的需求,但一种方法是使用“面向行”的函数,首先获取行,然后使用sscanf()
而不是{{1}单独处理该行}}
scanf()
一般来说,这种方法更可取,因为它允许您对输入执行任何必要的验证,而不是假设 stdin 中的内容始终有效。
请注意,#define ROW_BUFF_LEN 128
char row_buffer[ROW_BUFF_LEN] ;
for (i = 0; i < rows; ++i)
{
fgets( row_buffer, MAX_ROW_LEN, stdin ) ;
while( sscanf("%d", &arr[i][j++]) == 1 )
{
++j;
}
}
对teh stdin 流的使用优先于fgets()
,因为后者没有缓冲区溢出保护。
答案 2 :(得分:0)
\ n与scanf()一起处理已知已损坏。如果它可以工作,它可能会对某些库版本这样做,但永远不可移植。如果用户交互需要,最好尝试使用termlib / termcap / curses / ncurses,如果需要进行自动数据处理,请使用fgets()并解析输入。
答案 3 :(得分:-1)
仅使用scanf
无法实现AFAIK,您必须使用gets
的组合来读取临时缓冲区(因为gets
将以\n
结束然后用scanf
之类的内容扫描缓冲区以读取每个int。
注意:正如彼得强调的那样,gets
不适合生产用途,但对于你的任务 - 这是足够的IMO。
实际上,不是scanf
,而是考虑使用strtol
从读入行中提取整数。