1

我正在使用 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);
4

4 回答 4

1

strtok 给出指向标记化字符串的指针。

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

于 2012-10-26T11:28:38.140 回答
1

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

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

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

于 2012-10-26T11:42:17.107 回答
0

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

于 2012-10-26T11:47:37.263 回答
0

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

不过,值得注意的是,由于输入已更改,并且可能将输入传递给您的人并没有预料到,因此在调用它之前先将输入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
于 2018-01-30T02:07:36.400 回答