在Windows上使用包含库时,C代码未运行

时间:2017-12-02 04:42:42

标签: c windows mingw

我正在尝试在visual studio代码上运行此代码,但它无法运行。如果我没有使用string.h中的任何内容并且只打印一个字符串,它就可以找到但是一旦我使用strtok这样的方法,文件就会编译但是在运行和/或运行.exe时没有显示任何内容,我得到了它已停止工作的错误消息。我已经为C安装了基础mingw包。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    char* string = "Visual Studio Code";
    strtok(string, " ");
    printf(string);

    return 0;
}

这是我的c_cpp_properties.json文件,其中包含了诸如string.h等库。

    {
        "name": "Win32",
        "includePath": [
            "${workspaceRoot}",
            "C:\\MinGW\\lib\\gcc\\mingw32\\6.3.0\\include",
            "C:\\MinGW\\lib\\gcc\\mingw32\\6.3.0\\include-fixed",
            "C:\\MinGW\\include"

    ],

2 个答案:

答案 0 :(得分:1)

指针string指向字符串文字。这些不可写,实际上通常存在于只读存储器部分。 strtok函数修改传递给它的字符串。因为它试图修改字符串文字,所以您调用未定义的行为,在这种情况下会导致应用程序崩溃。

您需要创建一个可以修改的数组。

char string[] = "Visual Studio Code";

答案 1 :(得分:1)

从标准7.24.5.8

  

然后strtok函数从那里搜索一个字符   包含在当前分隔符字符串中。如果没有这样的角色   发现,当前令牌延伸到指向的字符串的末尾   通过s1,后续搜索令牌将返回空指针。   如果找到这样的字符,则会被空字符覆盖,   它终止当前令牌。 strtok函数保存了一个   指向以下字符的指针,从中搜索下一个字符   令牌将开始。

字符串文字是不可修改的,你将它传递给尝试修改它的strok。这是未定义的行为。在你的情况下你有分段错误。

解决方案:

char string[] = "Visual Studio Code";