C使用getline忽略换行符\ n

时间:2018-10-08 11:31:33

标签: c character newline getline ignore

我想使用

读取C语言中可变数量的字符串
ssize_t getline(char **lineptr, size_t *n, FILE *stream);

功能。所以我想出了以下代码:

int main() {
    int number;
    char *line;
    size_t len;
    scanf("%d", &number);
    for (int i = 0; i < number; ++i) {
        line = NULL;
        getline(&line, &len, stdin);
        printf("%s", line);
    }
}

上述代码的问题在于,第一次调用getline读取的是换行符('\n'),该换行符紧跟输入的数字而不是第一个字符串。添加以下代码行之一(由OPTION 1 resp. OPTION 2表示)可以解决此问题:

int main() {
    int number;
    char *line;
    size_t len;
    scanf("%d", &number);
    // fflush(stdin);                                            /* OPTION 1 */
        for (int i = 0; i < number; ++i) {
        line = NULL;
        getline(&line, &len, stdin);
        // while (*line == '\n') getline(&line, &len, stdin);    /* OPTION 2 */
        printf("%s", line);
    }
}

我的问题:

  

是否添加这些行之一(OPTION 1, OPTION 2)的正确方法?

     

如果这样的话,哪个会比另一个更受欢迎?

     

如果不是,那是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

  

添加这些行之一(选项1,选项2)是执行此操作的正确方法吗?

根据标准,OPTION 1是未定义的行为,因此即使它在您的系统上可以正常工作,我也不推荐它。

选择2更好,它将“吃掉”您想要的'\n'留下的scanf。但是它也会“吃掉”仅由换行符组成的任何后续输入。

如果您只是想从number的输入中“吃掉”换行符,我可能会这样做:

int main() {
   int number;
   char *line = NULL;
   size_t len = 0;
   getline(&line, &len, stdin);
   if (sscanf(line, "%d", &number) != 1)
   {
       // Illegal input
       exit(1);
   }
   for (int i = 0; i < number; ++i) {
     // -------------------    line = NULL;   Delete this - see below
     getline(&line, &len, stdin);
     printf("%s", line);
   }
   free(line);
   retur 0;
}

请注意,您只能在程序开始时将line设置为NULL。在每个循环中将其设置为NULL会导致内存泄漏。另请注意free(line)

答案 1 :(得分:0)

问题出在scanf上。

scanf("%d", &number);

您正在从stdin中读取一个整数。但是,通过按Enter键,它会在输入末尾自动添加“ \ n”。 因此,scanf完成后,标准输入中就会剩下"\n"

看看这一点,它提供了更多详细信息:Remove \n after scanf() which read integer

要摆脱scanf之后的新行,一种简单的解决方案是在格式字符串的末尾添加“ \ n”:

int main() {
   int number;
   char *line;
   size_t len;
   scanf("%d\n", &number);
   for (int i = 0; i < number; ++i) {
     line = NULL;
     getline(&line, &len, stdin);
     printf("%s", line);
   }
}

扫描一个整数,后跟可选的空格。