【问题标题】:break a string into 'first' and 'second'将字符串分成“第一”和“第二”
【发布时间】:2016-09-30 05:27:54
【问题描述】:

我已经阅读了无数的strtok 帖子,甚至直接将其中的全部内容复制到一个新的int main 中,但我不知道如何创建函数get_firstget_second

get_first("This is a sentence."); //returns "This"

get_rest("This is a sentence."); //returns "is"

这是我目前所拥有的,除了strtok 的问题,我什么都没有,但我不知道还能用什么。

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

char * get_first(char * string) {
    string = strtok(string, " ");
    return string;
}

char * get_second(char * string) {
    string = strtok(string, " ");
    string = strtok(NULL, " ");
    return string;
}

int main(int argc, char * argv[]) {
    char * test_string = "This is a sentence.";
    char * first = get_first(test_string);
    char * second = get_second(test_string);
    printf("%s\n", first);
    printf("%s\n", second);
}

使用 gcc -g -Wall 编译没有错误,但它总是 seg 错误。我想我已经尝试了char c[]char * c 的所有排列。

【问题讨论】:

  • 首先,strtok 修改了字符串,因此它必须是可写的。您的 test_string 是只读的。其次,您不能在同一个字符串上调用get_second,因为get_first 调用后由于strtok 对其进行的修改,它将不再是原始字符串。
  • char test_string[] = ...
  • @melpomene get_secondget_first 之后无法按预期工作。
  • 是的,我对strtok 的细节很困惑,我想我现在对它有了更好的理解,谢谢。
  • 更改这一行:string = strtok(NULL, " ");string = string+strlen(string); 或者:``string = string+strlen(string)+1;`;

标签: c segmentation-fault strtok


【解决方案1】:

strtok 更改字符串。 (但不允许更改字符串文字。)
所以创建一个副本。

执行以下操作:

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

char * get_first(const char *string){
    char *clone = strdup(string);//create copy, strdup is non standard. malloc and copy.
    char *token = strtok(clone, " ");
    if(token)
        token = strdup(token);
    free(clone);
    return token;
}

char * get_second(const char *string) {
    char *clone = strdup(string);
    char *token = strtok(clone, " ");
    if(token && (token = strtok(NULL, " ")))
        token = strdup(token);
    free(clone);
    return token;
}

int main(void) {
    char * test_string = "This is a sentence.";
    char * first = get_first(test_string);
    char * second = get_second(test_string);
    printf("%s\n", first);
    printf("%s\n", second);
    free(first);
    free(second);
}

【讨论】:

  • 这正是我所追求的,谢谢。我在之前的尝试中尝试过复制字符串,但我使用的是strcpy,并且每次尝试打印它们时都会出现段错误。
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 2020-12-17
  • 1970-01-01
  • 2022-11-22
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多