Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c语言中读取换行符_C_Output - Fatal编程技术网

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

如何在c语言中读取换行符,c,output,C,Output,有人能解释一下下面的代码吗 #include<stdio.h> main() { char c[]="abc\nabc"; puts(c); } 但是当我尝试从用户那里获取相同的字符串作为输入时 #include<stdio.h> main() { char c[]="abc\nabc"; gets(c); // i type in "abc\nabc" puts(c); } 如何使程序正确读取换行符?

有人能解释一下下面的代码吗

#include<stdio.h>
main()
{
    char c[]="abc\nabc";
    puts(c);
}
但是当我尝试从用户那里获取相同的字符串作为输入时

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

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

您是否确实键入了
\
然后键入了
n

如果是这样,它会在字符串中依次放置一个
\
和一个
n
,就像您执行了以下操作一样:

char c[] = "abc\\nabc"; /* note the escaped \ */
这在逻辑上不是换行符,而是一个
\
后跟一个
n

如果希望支持in-user input,则需要对任何用户输入进行后期处理,以创建适当的转义序列

/* 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;

在字符串文字或字符常量中,“\n”是一个字符,其中\称为转义字符。但是作为输入,“\”是一个真实的字符,而不是转义字符。

FYI:.@dicarlo2-.@OliCharlesworth感谢您的链接!自从上次我用C/C++编写代码以来,我肯定记不起来了。我不明白你的意思。单个字符变量c[i]如何能容纳两个字符(\\)@Sibi:
“\\”
是一个字符。谢谢!解决了我的问题。但是为什么这个代码'char c[]=“abc\nabc”;'将“\n”存储为单个字符?因为
“\n”
是新行的转义序列,编译器将其转换为相应的单个代码点(或宽代码点,具体取决于设置)。您的console/shell/TTY/text文件不知道或不关心C转义序列。
char c[] = "abc\\nabc"; /* note the escaped \ */
/* 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;