C编程strtok问题

时间:2012-10-26 11:26:01

标签: c strtok initializer

我正在使用strtok从字符串名称[result]中提取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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

其他答案都是正确的,因为复制字符串数据将使该程序正常工作,但strtok如此卑鄙(并且通常使用它被认为是不明智的)的原因是它改变了你的输入将NULL插入原始字符串中。无论如何你都要使用它,你也可以利用它,只需使用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