【问题标题】:How can I use strtok without corrupting the original strings data in c?如何在不破坏 c 中的原始字符串数据的情况下使用 strtok?
【发布时间】:2022-07-29 08:27:15
【问题描述】:

我正在使用strtok 将用户函数拆分为三个(名字、中间名、姓氏),我不想破坏原始输入,因为我以后需要它,我想为了做到这一点,我需要将它复制到另一个变量中。我已经尝试过并且失败了。如何初始化char* fullName,以便将nameFull_ptr 数据复制到其中? (我使用 Visual Studio 2022)

void separate(char* nameFull_ptr, char* name1_ptr, char* name2_ptr, char* name3_ptr)
{
    char* fullName = 0; // This is temporary for the sake of initialization
    strcpy(fullName, nameFull_ptr);

    char *token = strtok(fullName, " ");
    int count = 0;

    while (token != NULL)
    {  
        count++;
        switch (count)
        {
        case 1:
            strcpy(name1_ptr, token);
            break;
        case 2:
            strcpy(name2_ptr, token);
            break;
        case 3:
            strcpy(name3_ptr, token);
        }
        token = strtok(NULL, " ");
    }
}

【问题讨论】:

  • TL;DR: char fullName[10000]; 有点老套但是...
  • 欢迎。你应该看看How to Asktour,如果你还没有这样做的话。也看看minimal reproducible example。这是您在提问时应牢记的一般信息。

标签: c pointers initialization c-strings strtok


【解决方案1】:

你不能。此功能以这种方式工作。要保留原始字符串,您需要对其进行复制。

您的代码中还有一些重要的错误。

    char* fullName = 0; // This is temporary for the sake of initialization
    strcpy(fullName, nameFull_ptr);

你复制到 NULL 指针。这是未定义的行为,肯定不会起作用。

你需要分配一些内存。

    char* fullName = malloc(strlen(nameFull_ptr) + 1);
    if(fullName) strcpy(fullName, nameFull_ptr);

【讨论】:

  • 谢谢,但我试过了,malloc 给了我一个错误
  • @Nevada 什么错误?再试一次。并停止使用 C++ 编译器
  • char *fullName = strdup(nameFull_ptr)
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 2013-04-13
相关资源
最近更新 更多