如何在C语言中读取换行符

4
请问以下代码是做什么用的?
#include<stdio.h>
main()
{
    char c[]="abc\nabc";
    puts(c);
}

这段代码如预期生成:

abc
abc

但是当我尝试从用户输入相同的字符串时,

#include<stdio.h>
main()
{
    char c[]="abc\nabc";
    gets(c);             // i type in "abc\nabc" 
    puts(c);
}

这段代码生成以下内容:
abc\nabc

如何让程序正确读取换行符?

3
请注意:【决不要】使用 gets,请改用 fgets代替。原文链接:https://dev59.com/JXA75IYBdhLWcg3wboc0。 - Oliver Charlesworth
2
@dicarlo2 - 因为它非常、非常不安全. - user554546
@OliCharlesworth 谢谢链接!自从上一次写C/C++以来,我绝对没有想起这个东西。 - Alex DiCarlo
2个回答

4

您是字面上输入了 \ 然后是 n 吗?

如果是这样的话,它会在您的字符串中字面上放置一个 \ 然后是一个 n,就好像您执行了以下操作:

char c[] = "abc\\nabc"; /* note the escaped \ */

这个字符逻辑上不是换行符,而是后跟一个 n\

如果您想支持用户输入中的转义序列,则需要对任何用户输入进行后处理以创建适当的转义序列。

/* translate escape sequences inline */
for (i = 0, j = 0; c[i] != 0; ++i, ++j) {
   if (c[i] == '\\' && c[i+1] != 0) {
       switch(c[++i]) {
       case 'n':  c[j] = '\n'; break;
       case '\\': c[j] = '\\'; break;
       /* add the others you'd like to handle here */
       /* case 'a': ... */
       default:   c[j] = ' ';  break;
       }
   } else {
       c[j] = c[i];
   }
}

c[j] = 0;

我不明白你的意思。一个单个字符的变量c[i]怎么可能容纳两个字符(\)。 - sr01853
1
@Sibi:'\\' 是一个字符。 - Dietrich Epp
谢谢!问题已解决。但是为什么这行代码'char c[]="abc\nabc";'把 '\n' 存储为单个字符呢? - Ankit Rustagi
1
因为"\ n"是换行符的转义序列,你的编译器将其转换为适当的单代码点(或宽代码点,取决于设置)。你的控制台/ shell / TTY / 文本文件不知道也不关心C转义序列。 - user7116

2
在字符串文字或作为char常量中,'\n'是一个字符,其中\被称为转义字符。但作为输入时,'\'是一个真正的字符,而不是转义字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接