Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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_Scanf - Fatal编程技术网

扫描集不';我不认识c中的回车,为什么?

扫描集不';我不认识c中的回车,为什么?,c,scanf,C,Scanf,我正在尝试将输入带扫描集的回车键,即回车键。(windows上的哪个等于\r\n,对吗?)。现在,如果我在scanf()中编写%[^\n],这就行了,但对于%[^\r],我认为这也应该行得通。那么这里的陷阱是什么呢? #include <stdio.h> int main() { char str[120]; scanf("%[^\r]", str); printf("%s",str); } #包括 int main() { char-str[120]

我正在尝试将输入带扫描集的回车键,即回车键。(windows上的哪个等于\r\n,对吗?)。现在,如果我在scanf()中编写
%[^\n]
,这就行了,但对于
%[^\r]
,我认为这也应该行得通。那么这里的陷阱是什么呢?

#include <stdio.h>

int main()
{
    char str[120];

    scanf("%[^\r]", str);

    printf("%s",str);
}
#包括
int main()
{
char-str[120];
scanf(“%[^\r]”,str);
printf(“%s”,str);
}

您正在从标准输入读取数据。标准输入是一个文本输入流。在文本输入流中,行尾由
\n
字符指示,无论它是否发生在“Windows”上。除其他外,文本输入流的目的是确保在输入数据到达
scanf
时,该数据至少已转换为与平台无关的行尾形式。“在Windows上”
\r\n
组合在到达
scanf
时已被一个单独的
\n
替换。通过使用
scanf
读取标准的Windows输入,您无法看到
\r\n
(除非您使用Unix输入流读取Windows文本文件)。

。当我使用像getchar()这样的函数时,它可以读取'\r'字符。为什么呢?它是否只在scanf()中发生?它不依赖于函数,而是依赖于底层流。阅读
fopen
文档了解更多信息(或查找文本流和二进制流)。@prithul:我不知道即使使用
getchar()
,您是如何看到
\r
的。我刚刚试过,在我的实验中,
getchar()
读取
\n
而没有其他内容。如果您使用Unix标准库(即Unix版本的
getchar()
)读取Windows文本文件,则您将在每行末尾看到
\r\n
。但是Windows自己的
getchar()
不应该看到
\r
。我说getchar()是个错误。实际上我试过使用getche()。是的,我知道这不是一个标准函数。但是我想知道为什么它对getche()有效。它使用不同的流吗?@prithul:嗯,我猜
\u getche
根本不适用于标准输入流。它看起来像是一个直接从键盘读取输入的函数。或者,如果它使用标准输入,它可能会在较低的(原始)级别读取它,其中尚未发生行尾转换。使用最大字段宽度,
scanf
无法神奇地知道缓冲区有多大:
scanf(“%119[^\r]”,str)。。。