无法通过 c 中的 strtok 函数获取数组中的字符串

Couldn't get string in array by strtok function in c

我打算从 csv 文件中获取数据,但是当我将拆分的字符串放入数组时,我使用 strtok 函数在此处通过逗号分隔拆分数据。它无法显示真实输出

#include <stdio.h>
#include <string.h>

int i = 0;
int j = 0;
char *name[20];



int main() {
    FILE *fp = fopen("meetingData.csv", "r");
    if (!fp)
        printf("Can't open file\n");

    else {
        int count;
        char buffer[1024];

        while (fgets(buffer,1024, fp)) {
            char *value = strtok(buffer, ", ");
            printf("%s\n",value);
            int x = 0;
            while (value != NULL) {
                if (x == 0) {
                    name[i] = value;
                    printf("name[%d]is  %s", i, name[i]);
                    i = i + 1;
                    x++;
                } else if (x == 1) {
                    printf("\n");
                    x++;
                } else {
                    //time[j] = j+'0';
                    //  printf("%s",value);
                    //printf("%d\n",x);
                    x++;
                    j++;

                }
                value = strtok(NULL, ",");
               // printf("%d\n", x);
            }


        }
        for (int k = 0; k < count; k++) {
            printf("%s\n", name[k]);
          //  printf("%s\n", time[k]);
      }
        fclose(fp);
        }

    return 0;
}

在这里你可以看到我的输出,它们用数组显示数据

但是当我循环打印时,最后一个元素将为整个数组索引打印

/home/karan/untitled14/cmake-build-debug/untitled14
Ashley_Parry
name[0]is  Ashley_Parry
Namal_Perera
name[1]is  Namal_Perera
Namal_Perera
name[2]is  Namal_Perera
Prabath_Silva
name[3]is  Prabath_Silva
Bethany_William
name[4]is  Bethany_William
Ashley_Parry
name[5]is  Ashley_Parry
Namal_Perera
name[6]is  Namal_Perera
Aaliya_Bruce
name[7]is  Aaliya_Bruce
Aaliya_Bruce
name[8]is  Aaliya_Bruce
Prabath_Silva
name[9]is  Prabath_Silva
Waruni_Fernando
name[10]is  Waruni_Fernando
Raul_Oliver
name[11]is  Raul_Oliver
Aaliya_Bruce
name[12]is  Aaliya_Bruce
Dr_Rajitha_Karunarathna
name[13]is  Dr_Rajitha_Karunarathna
Raul_Oliver
name[14]is  Raul_Oliver
Jasper_Jensen
name[15]is  Jasper_Jensen
Jasper_Jensen
name[16]is  Jasper_Jensen
Namal_Perera
name[17]is  Namal_Perera
Chamira_Perera
name[18]is  Chamira_Perera
Wasana_Tennekoon
name[19]is  Wasana_Tennekoon
Dr_Kamal_Jayasooriya
name[20]is  Dr_Kamal_Jayasooriya
Raul_Oliver
name[21]is  Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver
Raul_Oliver

strtok 不分配任何内存,它只是 returns 指向您使用的内存的指针。在这里,您有一个 buffer,您可以在其中读取数据,然后对其进行标记化。这意味着每次返回的第一项指针都与 buffer 相同,并且每次读取新数据时它都会覆盖旧数据。

您需要为要存储的数据分配内存(可能使用 strdup),然后在不需要时设法释放它。

以下建议代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 消除重复变量
  4. 消除重复打印
  5. 为变量使用有意义的名称
  6. 演示如何报告来自 'fopen()'
  7. 的错误
  8. 表现出一致的水平间距(为了便于阅读)
  9. 演示垂直间距的方法(为了便于阅读)
  10. 正确提取指向 CSV 名称的指针
  11. 适当地最小化变量的范围
  12. 正确计算 CSV 名称的数量
  13. 不关闭输入文件,直到所有行都为 read/processed

现在,建议的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUF_LEN 1024
#define MAX_CSV 20

int main( void )
{
    FILE *fp = fopen( "meetingData.csv", "r" );
    if (!fp)
    {
        //printf("Can't open file\n");
        perror( "fopen to read meetingData,csv failed" );
        exit( EXIT_FAILURE );
    }

    char buffer[ BUF_LEN ];
    while ( fgets( buffer, sizeof(buffer), fp ) ) 
    {
        int count=0;
        char *name[ MAX_CSV ] = {NULL};
        
        char *value = strtok( buffer, ", " );
        while ( count < MAX_CSV && value != NULL ) 
        {
            name[ count ] = value;
            printf("name[%d] is  %s", count, name[ count ]);
            count++;
            
            value = strtok( NULL, "," );
        }
    }

    fclose( fp );
    return 0;
}