我写的程序,分裂西里尔文从标准输入和打印逐行.阅读文本后,使用fgetws我得到分割故障.使用gdb返回以下内容:

Program received signal SIGSEGV, Segmentation fault.
wcstok (wcs=0x7fffffffda90 L"", delim=0x7fffffffda80 L" ,-", save_ptr=0x0) at wcstok.c:45
45      wcstok.c: No such file or directory.

代码:

#include <stdio.h>
#include <wchar.h>
#include <wctype.h>

int main() {
    wchar_t sentence[201];

    fgetws(sentence, 201, stdin);
    
    wchar_t delimiters[] = L" ,-";

    wchar_t *word = wcstok(sentence, delimiters, NULL);

    while (word != NULL) {
        wprintf(L"%ls", word);
        word = wcstok(NULL, delimiters, NULL);
    }

    return 0;
}

我用的是GCC 9.4.0

推荐答案

这些wcstok人的电话

wchar_t *word = wcstok(sentence, delimiters, NULL);

while (word != NULL) {
    wprintf(L"%ls", word);
    word = wcstok(NULL, delimiters, NULL);
}

是不正确的.第三个参数不能为空指针.

您应该编写类似以下内容的内容

wchar_t *ptr;

wchar_t *word = wcstok(sentence, delimiters, &ptr);

while (word != NULL) {
    wprintf(L"%ls", word);
    word = wcstok(NULL, delimiters, &ptr);
}

从C标准(7.29.4.5.7 wcstok函数):

3序列中的第一个调用具有非空的第一个参数,并且 将初始值存储在PTR指向的对象中.Subsequent calls in the sequence have a null first argument and the object pointed to by ptr is required to have the value stored by the previous call in the sequence,,然后进行更新.分隔符宽度 S2指向的字符串可能因调用而不同.

C++相关问答推荐

文件权限为0666,但即使以超级用户身份也无法打开

将uintptr_t添加到指针是否对称?

Sizeof(&Q;字符串&Q;)的正确输出是什么?

理解C版宏(看起来像未声明的变量?)

这个计算C中阶乘的函数正确吗?

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

我可以创建适用于不同endian的 colored颜色 struct 吗?

通过char*访问指针的对象表示是未定义的行为吗?

GDB 跳过动态加载器代码

如何向 execl 创建的后台程序提供输入?

无法在线程内用 C 打印?

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?

K&R 练习 1-24

为什么简单的 ELF 二进制文件中存在重叠和未对齐的段?

使用指针与使用索引来访问数组的性能差异能有人解释一下吗?

在C89中,将unsigned char转换为signed char及其反向转换是否有明确定义?

C中如何反转字符串数组

函数内使用全局变量会导致创建一个本地副本吗?

函数调用前总是执行后增操作吗?

C语言下的埃拉托斯特尼筛法并行化