C 如何复制存储在strtok()令牌中的字符串?

C 如何复制存储在strtok()令牌中的字符串?,c,strtok,C,Strtok,我正在尝试复制strtok()标记的值 我正在用volatile值在字符串上运行strtok() char buffer[100]; char temp[100]; for(int i = 0; i < 100; i++){ fgets(buffer, 100, my_file); fscanf(my_file, "%s", temp) } 我试图用strcpy()复制令牌的值,并将重复的值存储在数组中。将代码转换为MCVE(),我得到: 不清楚您的代码有什么问题 这显然

我正在尝试复制
strtok()
标记的值

我正在用
volatile
值在
字符串上运行
strtok()

char buffer[100];
char temp[100];
for(int i = 0; i < 100; i++){
    fgets(buffer, 100, my_file);
    fscanf(my_file, "%s", temp)
}

我试图用strcpy()复制令牌的值,并将重复的值存储在数组中。

将代码转换为MCVE(),我得到:

不清楚您的代码有什么问题

这显然不是一个普遍的解决办法。它依赖于以三位数字1、2、3开头的三个标记,并且正好有三个标记,并且没有一个标记超过99个字符,依此类推。但是您的代码会将令牌安全地复制到您的数组中

这是更通用的代码,使用POSIX(但不是C)标准函数


将代码转换为MCVE(),我得到:

不清楚您的代码有什么问题

这显然不是一个普遍的解决办法。它依赖于以三位数字1、2、3开头的三个标记,并且正好有三个标记,并且没有一个标记超过99个字符,依此类推。但是您的代码会将令牌安全地复制到您的数组中

这是更通用的代码,使用POSIX(但不是C)标准函数


'1'
1
不一样。您需要使用
大小写来使用前者而不是后者。
“100”
需要四个字节来存储-三个ascii字符加一个终止NUL。您的数组太小,向其中复制字符串将导致缓冲区溢出。您似乎缺少
token=strtok(NULL,,”
在switch语句之后以获取下一个标记
switch
语句的格式不正确(案例“2”
不属于所示的
开关
)。您错过了
{
。在第二次
strtok()
之后,在循环结束时,您也错过了一个
}
。这个问题最简单的答案通常是
strdup()
,如果您可以的话。如果不是,就写它:
char*strdup(const-char*str){size\t len=strlen(str);char*dup=malloc(len+1);If(dup!=0)memmove(dup,str,len+1);return dup;}
-看着人们大喊
memcpy()
vs
memmove()
但是,只要令牌以数字1、2或3开头,您所得到的或多或少都会起作用。
'1'
1
是不同的。您需要使用
大小写来使用前者而不是后者。
“100”
需要四个字节来存储-三个ascii字符加一个终止NUL。您的数组太小,向其中复制字符串将导致缓冲区溢出。您似乎缺少
token=strtok(NULL,,”
在switch语句之后以获取下一个标记
switch
语句的格式不正确(案例“2”
不属于所示的
开关
)。您错过了
{
。在第二次
strtok()
之后,在循环结束时,您也错过了一个
}
。这个问题最简单的答案通常是
strdup()
,如果您可以的话。如果不是,就写它:
char*strdup(const-char*str){size\t len=strlen(str);char*dup=malloc(len+1);If(dup!=0)memmove(dup,str,len+1);return dup;}
-看着人们大喊
memcpy()
vs
memmove()
但是,只要标记以数字1、2或3开头,您所得到的或多或少都会起作用。抱歉,Kaylum在一篇评论中修复了我的问题,但我不确定如何将其设置为“已修复”,因为他们只发布了一条评论,而没有回复。这有点棘手。你可以对自己的问题发表评论,你可以注意到kaylum已经解决了这个问题,并邀请他提交一个你会接受的答案。这样的评论很好。如果你需要在回复评论时澄清你的问题,你可以通过编辑问题来做到——我相信你已经多次这样做了。我主要提交了我的答案,因为我对另一次尝试回答不满意。对不起,Kaylum在一篇评论中解决了我的问题,但我不确定当他们只发布了一条评论而没有回答时,如何将其设置为“修复”。这有点棘手。你可以对自己的问题发表评论,你可以注意到kaylum已经解决了这个问题,并邀请他提交一个你会接受的答案。这样的评论很好。如果你需要在回复评论时澄清你的问题,你可以通过编辑问题来做到——我相信你已经多次这样做了。我主要提交了我的答案,因为我对另一次尝试答案不满意。
char my_array[3][100];
char* token;
token = strtok(temp,",");
while(token != NULL){
    switch (token[0]){
        case '1' :
        strcpy(my_array[0], token);
        break;
        case '2' :
        strcpy(my_array[1], token);
        break;
        case '3' :
        strcpy(my_array[2], token);
        break;
    }
    token = strtok(NULL,",");
}
#include <stdio.h>
#include <string.h>

int main(void)
{
    char temp[] = "100,200,300";
    char my_array[3][100];
    char *token = strtok(temp, ",");

    while (token != NULL)
    {
        switch (token[0])
        {
        case '1':
            strcpy(my_array[0], token);
            break;
        case '2':
            strcpy(my_array[1], token);
            break;
        case '3':
            strcpy(my_array[2], token);
            break;
        }
        token = strtok(NULL, ",");
    }
    for (int i = 0; i < 3; i++)
        printf("%d: [%s]\n", i, my_array[i]);
    return 0;
}
0: [100]
1: [200]
2: [300]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char temp[] = "100,200,300,19231,Exploratorium,Extraneous material,91"
                  "9293,and one rather long token without much significance"
                  " except to point out that not all strings are as short as"
                  " 100 bytes long";
    char *my_array[100];
    int count = 0;

    char *token = strtok(temp, ",");
    while (token != NULL)
    {
        if (count >= 100)
            break;
        my_array[count++] = strdup(token);
        token = strtok(NULL, ",");
    }

    for (int i = 0; i < count; i++)
        printf("%d: [%zu][%s]\n", i, strlen(my_array[i]), my_array[i]);

    for (int i = 0; i < count; i++)
        free(my_array[i]);
    return 0;
}
0: [3][100]
1: [3][200]
2: [3][300]
3: [5][19231]
4: [13][Exploratorium]
5: [19][Extraneous material]
6: [6][919293]
7: [123][and one rather long token without much significance except to point out that not all strings are as short as 100 bytes long]