如何使用\ n打破scanf%d循环

时间:2012-03-08 10:08:08

标签: c

我将按空格分隔的整数输入到二维数组中,如下所示(假设用户输入的值总是超过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}

4 个答案:

答案 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从读入行中提取整数。