※ 引述《jserv (松鼠)》之铭言:
: 上述程式仍有改进空间,随意列出:
: 1. 缺乏对于 EOF 的处理;
: 2. 程式码忽略超出 50 个字符 (正确来说还要减去 NULL terminator) 的处理,
: 但可能会跟使用者期望有落差;
由于 C 语言不像 C++ 那样有大量的模板库可以用
所以 我找到了个专门为 C 语言撰写的 linked list 容器来用
OpenGC3: https://github.com/kevin-dong-nai-jia/OpenGC3
然后增加了 (1) 对 EOL 的处理
(2) 可以处理无限多个字符 只要你的硬件也有足够大
(3) 支持 Unicode UTF-8 编码的字符
大家晚安 <3
==== 程式开始 ====
好读版:https://gist.github.com/anonymous/aee4302b30d2d4c23f9404b48b9dd76f
#include <stdio.h> // for EOF / stderr
#include <stdlib.h> // for EXIT_FAILURE
#include <wchar.h> // for wcslen()
#include <wctype.h> // for to(upper|lower)()
#include <errno.h> // for errno
#include <locale.h> // for setlocale()
#include "src/list/ccxll.h" // for container ccxll(T)
typedef struct { wchar_t wc[8]; } wcb_t;
int main(void)
{
// assign locale
if (setlocale(LC_ALL, "en_US.UTF-8") == NULL) {
fprintf(stderr, "Failed to set locale LC_ALL = en_US.UTF-8.\n");
exit(EXIT_FAILURE);
}
// create a list container
ccxll_pckd(wcb_t) list;
ccxll_init_extd(list, 1, 1, 1);
// read from stdin
wcb_t str;
// invert cases (upper <-> lower)
while ((fgetws(str.wc, 8 - 1, stdin) != NULL)) {
if (ferror(stdin)) {
fprintf(stderr, "Encountered an invalid wide character.\n");
exit(EXIT_FAILURE);
}
for (size_t len = wcslen(str.wc), idx;
idx = len - 1, len != 0; len