我编写了以下代码:
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t wc[80];
wscanf(L"%ls", &wc);
wprintf(L"%ls", wc);
return 0;
}
我的终端支持Unicode,在Linux上使用gcc 8.2.1编译。
以下是您的程序的固定版本:
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main(void)
{
wchar_t ws[80];
if (!setlocale(LC_ALL, ""))
fprintf(stderr, "Warning: The C library does not support your current locale.\n");
if (fwide(stdin, 1) < 1)
fprintf(stderr, "Warning: The C library does not support wide standard input for your current locale.\n");
if (fwide(stdout, 1) < 1)
fprintf(stderr, "Warning: The C library does not support wide standard output for your current locale.\n");
if (wscanf(L"%79ls", ws) < 1) {
fprintf(stderr, "No input.\n");
exit(EXIT_FAILURE);
}
wprintf(L"%ls\n", ws);
return EXIT_SUCCESS;
}
setlocale()
调用告诉C库使用当前配置的区域设置。如果不这样做,C库将使用其默认区域设置(C/POSIX区域设置),该区域设置通常使用ASCII字符集(而不是UTF-8)。
fwide(stdin,1)
和fwide(stdout,1)
调用告诉C库您将使用带有标准输入的宽输入函数和带有标准输出的宽输出函数。如果C库在当前区域设置中不支持它,它们将返回-1;我相信目前在Windows中基于UTF-8的区域设置中会发生这种情况,因为微软希望程序员使用他们专有的扩展来代替这种情况。
fwide()
调用不是必需的,因为C库将根据每个流使用的第一个函数进行猜测。我确实建议显式地使用它们,以便用户知道它们当前的配置或C库支持是否存在不确定/错误/不受支持的地方。毕竟,这只是增加了几行。
扫描字符串时,应始终在模式中包含允许的最大长度(紧随%
之后)。因为C字串有一个终止nul字符(窄字串有'\0'
,宽字串有L'\0'
),所以缓冲区必须至少长一个。因为ws
是一个包含80个宽字符的数组,所以wscanf()
最多可以扫描79个字符的字符串。
所有扫描函数(scanf()
、wscanf()
、fscanf()
、fwscanf()
等)返回成功转换的次数或EOF/WEOF。例如,如果用户运行true./thisprogram
,则标准输入中没有任何输入,wscanf()
调用将返回WEOF。除了几个罕见的异常(使用禁止转换来使用/跳过数据,或者使用%n
)进行转换)之外,您将希望检查返回值。如果不检查上面示例中的返回值(true./thisprogram
),最终将打印一个未intialized的宽字符缓冲区。这是不好的;它可以什么也不打印,打印垃圾,或者使程序崩溃:这是未定义的行为。
(同样重要的是要记住,如果转换失败,失败的部分将保留在输入中;它不会被消耗或扔掉。它只是坐在那里,除非你消耗它。)
如果最终输出行没有以换行结束,某些shell会在该行末尾添加%
字符。其他贝壳在那之后立即放上自己的提示符。这不是错误,只是看起来很奇怪。因此,总是在输出的末尾添加换行是个好主意。
默认情况下,标准输出也是行缓冲的。例如,在上面的程序中,使用wprintf(l“foo”)
并不意味着输出宽字符串foo
;它通常只是由标准的C库缓冲,并在一段时间后输出。您可以使用fflush(stdout);
告诉标准库输出特定流的缓冲区中的所有内容,例如标准输出。这适用于普通/窄流和宽流。然而,当程序退出时,C库将自动刷新缓冲区。
问题内容: 我正在编写一个连接到servlet的程序,这要感谢a,但是我在检查url时卡住了 我得到了错误: java.net.ProtocolException:读取输入后无法写入输出。 如果我用注释中的代码检查网址,但不幸的是它可以正常工作,我需要检查网址,所以我认为问题出在方法上,但我不知道如何解决 非常感谢你 问题答案: HTTP协议基于请求-响应模式:首先发送请求,然后服务器响应。服务器
问题内容: 我一周前开始使用Java,现在我想在窗口中插入一个图像。无论我尝试什么,我都会在Eclipse中继续使用它: javax.imageio.IIOException:无法读取输入文件! } 我认为代码很容易解释。我试图解决这个问题 我想做的是一个桌面程序,我的源代码存储如下:training / src / graphics / Window training / src / src /
问题内容: 我对Logstash有一个奇怪的问题。我正在提供一个日志文件作为logstash的输入。配置如下: 我已经在运行elasticsearch服务器并验证是否正在使用curl查询接收数据。问题是,当输入为时,没有数据被接收。但是,如果我将输入更改为以下内容,它将顺利发送所有输入数据: 我不明白我要去哪里错了。有人可以看看这个吗? 问题答案: 您应该在文件部分下设置start_positio
问题内容: 这是我的第一篇文章,请问如果我做错了什么。直到我尝试从源包中读取图像,此代码才能正常运行。但是现在它无法读取任何图像。我究竟做错了什么?还是关于日食的事? 例外: 谢谢… 问题答案: 改变了,如果你使用的是Windows。 更跨平台的方法将替代 对于每对。 进一步了解File api文档 编辑 (对不起,我没有读过此行) 这段代码运行正常,直到我尝试从源包中读取图像 为了从jar包中获
我有一个Storm喷口,可以从日志文件中读取。因此,当我在本地测试代码时,它工作得很好,因为我在运行作业时传递了运行时参数。 因此,如果有任何想法如何让它进行,这将是一个很大的帮助。
问题内容: 我不知道为什么这不起作用,但是程序说它无法读取输入文件。顺便说一下,这也在Ubuntu中运行: 这是示例代码: 该目录也位于程序的bin文件夹和src文件夹中。 问题答案: 如果您改为从资源流中获取图像怎么办?例如,