我写的程序,分裂西里尔文从标准输入和打印逐行.阅读文本后,使用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++相关问答推荐

是否可以在C中进行D3 D12申请?

为什么下面的C代码会进入无限循环?

以c格式打印时间戳

通过MQTT/蚊子发送大文件—限制在4MB

编译SDL 2时缺少SDL_ttf

如何解决C中的严格别名?

从组播组地址了解收到的数据包长度

为什么在此程序中必须使用Volatile关键字?

无法用C++编译我的单元测试

识别和处理c中整数溢出的最佳方法?

如何将常量char*复制到char数组

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

为什么此共享库没有预期的依赖项?

使用Open62541向OPCUA服务器发送读请求时内存泄漏

如何将两个uint32_t值交织成一个uint64_t?

Valgrind用net_pton()抱怨

使用正则表达式获取字符串中标记的开始和结束

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

无法理解 fgets 输出

int 与 size_t 与 long