无法通过 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
),然后在不需要时设法释放它。
以下建议代码:
- 干净地编译
- 执行所需的功能
- 消除重复变量
- 消除重复打印
- 为变量使用有意义的名称
- 演示如何报告来自 'fopen()'
的错误
- 表现出一致的水平间距(为了便于阅读)
- 演示垂直间距的方法(为了便于阅读)
- 正确提取指向 CSV 名称的指针
- 适当地最小化变量的范围
- 正确计算 CSV 名称的数量
- 不关闭输入文件,直到所有行都为 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;
}
我打算从 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
),然后在不需要时设法释放它。
以下建议代码:
- 干净地编译
- 执行所需的功能
- 消除重复变量
- 消除重复打印
- 为变量使用有意义的名称
- 演示如何报告来自 'fopen()' 的错误
- 表现出一致的水平间距(为了便于阅读)
- 演示垂直间距的方法(为了便于阅读)
- 正确提取指向 CSV 名称的指针
- 适当地最小化变量的范围
- 正确计算 CSV 名称的数量
- 不关闭输入文件,直到所有行都为 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;
}