【问题标题】:C programming strtok issueC编程strtok问题
【发布时间】:2012-10-16 16:01:33
【问题描述】:

我正在使用 strtok 从字符串名称中提取 2 个单词[结果]。我想从 strtok 中获取第一个值并将其存储到名为 lastName 的 char 数组中,并将第二个值存储到名为 firstName 的 char 数组中。但是,当我编译我的代码时,我得到了 2 行的无效初始化程序错误,由箭头指示。我该如何解决我的问题?

char *p = NULL;
p = strtok(names[result]," ");
char lastName[50] = p; <---
p = strtok(NULL, " ");
char firstName[50] = p; <---
printf("%s %s\n",firstName,lastName);

【问题讨论】:

  • sprintf() 也是一个选项

标签: c strtok initializer


【解决方案1】:

strtok 提供指向标记化字符串的指针。

char lastName[50] = p; 你在那里做的事情真的不是一件好事。应该使用 strncpy() 来复制字符串,或者如果只想要指针,则应该存储在另一个指针中。

【讨论】:

    【解决方案2】:

    C 中的数组初始化只能使用文字,不能使用变量。所以你的代码是语法错误。

    您需要使用典型的strcpy() 函数来复制字符串,或者一些更安全(和现代)的变体,例如strlcpy()snprintf()

    您还可以使用sscanf() 在一次调用中完成解析和复制,并在格式化字符串中使用适当的大小说明符以避免缓冲区溢出的风险。

    【讨论】:

      【解决方案3】:

      您可以将字符串初始化为字符数组,例如 char lastName[50] = "Sample"; 在这种情况下,您尝试初始化指向字符数组 'char lastName[50] = p;' 的指针这是无效的。 更好的是可以使用strcpy、memcpy函数将字符串复制到字符数组中,也可以在另一个指针中赋值。

      【讨论】:

        【解决方案4】:

        其他答案都是正确的,因为复制字符串数据将使该程序正常工作,但strtok 如此卑鄙的原因(通常使用它被认为是不明智的)是它通过插入更改了您的输入NULLs 到原始字符串中。如果你还是要使用它,你不妨利用这一点,只需使用strtok 直接返回的指针。

        但值得注意的是,由于输入已更改,并且可能将输入传递给您的人并没有预料到,因此最好将输入复制到单独的字符串 first 之前打电话给strtok

        观察这段代码的输出,看看我的意思:

        int main(int argc, char *argv[]) {
          char name[] = "Firstname Lastname";
        
          printf("Name before strtok: %s\n", name);
          char *first = strtok(name, " ");
          char *last = strtok(NULL, " ");
        
          printf("Token strings: first=%s last=%s\n", first, last);
          printf("Name after strtok: %s\n", name);
        }
        

        生产:

        Firstname Name before strtok: Firstname Lastname
        Token strings: first=Firstname last=Firstname
        Name after strtok: Firstname
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          相关资源
          最近更新 更多