【问题标题】:Issues splitting a string into 2 halves in C在 C 中将字符串分成两半的问题
【发布时间】:2012-07-09 18:21:28
【问题描述】:

我有一个包含空格的字符串,例如“print 2”或“print 3 test”。我正在尝试删除第一个参数 - 在这些示例中,打印。

我试过 strtok():

char *test;
test = strtok(COMMAND, " ");
printf("%s\n", test);

但是打印测试会出现段错误。我尝试创建一个函数,它可以从 main() 正常工作,但是当从我需要它的函数调用时,它也会出现段错误。

char* split(char S[], int N) {
    printf("Running split() on %s\n", S);
    int Spaces = 1;
    int i = 0;
    for (i; i<strlen(S) && Spaces <=N; i++) {
        if (S[i] == ' ') {
            Spaces++;
        }
    }
    printf("split: %s\n", &S[i]);
    //return "0";
    return &S[i];
}

我猜这是某种指针问题。命令被传递到 print 函数中,如下所示:

Print(File, Lines, COMMAND);

【问题讨论】:

  • 好吧,你永远不会初始化测试,所以你不能用 strtok 访问它。
  • 用一个空的填充字符串初始化它都有段错误。
  • COMMAND 初始化了吗?它是否包含“ ”?
  • 我认为你的第一个 sn-p 代码来自一个名为 Print 的函数;那么我们能看到它的定义是如何开始的吗? (特别是,我想知道你到底是如何声明COMMAND,它似乎存在于两个版本中,一个在Print 中,一个在任何调用Print 中。)我们可以看到COMMAND 是如何传递到Print 函数获得了它的价值?您描述的所有内容都与具有错误值的变量一致 - 例如,空指针或指向非空终止字符串的指针。
  • @Sterling 它包含一个字符串,可能带有空格,例如“print 2”。

标签: c string pointers split strtok


【解决方案1】:

我不知道您的测试样本中的 COMMAND 是什么,但您应该测试 strtok 是否返回 null(当 strtok 找不到令牌时)。 带有空指针的 printf 会给你一个 seg vault。

通常你从一个循环中调用 strtok: http://www.cplusplus.com/reference/clibrary/cstring/strtok/

【讨论】:

  • +1 printing with a nullpointer will give you a seg fault
【解决方案2】:

总是测试 strtok() 的返回值!

如果没有找到这样的字节(第二个参数),即。第一个参数指向的字符串中不存在标记,则返回空指针。

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2015-11-27
    • 2020-10-03
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多