我有一个包含bicho,25,25-04-2000
的char数组。
我想提取bicho
并将其放在变量中,25
和25-04-2000
也是如此。
我尝试了strtok()
和sscanf
,但没有运气。
这是我使用的方法:
fp = fopen(fn,"r");
while(!feof(fp)){
fgets(data, 255,fp);
puts(data);
pch = strtok (data,",");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, ",");
}
}
我想将每个值存储在单独的变量中而不打印它。
答案 0 :(得分:0)
您无需使用feof
。您可以使用fgets
作为循环条件。然后,只需将字符串存储在数组中即可。然后,您可以使用strtol
或atoi
(如果需要)以数字方式转换您的号码。例如,您可以执行以下操作:
#define MAXL 10
#define MAXC 32
char array[MAXL][MAXC] = ;
size_t index = 0;
if (!(fp = fopen (fn, "r"))) {
fprintf (stderr, "error: file open faied '%s'.\n", fn);
return 1;
}
while (fgets (data, 255,fp))
{
char *p = data;
if ((p = strtok (data, ","))) {
size_t plen = strlen (p);
if (plen + 1 < MAXC)
strncpy (array[index++], p, plen + 1);
else
fprintf (stderr, "error: string exceeded MAXC\n");
while (index < MAXL && (p = strtok (NULL, ",\n")) != NULL)
{
plen = strlen (p);
if (plen + 1 < MAXC)
strncpy (array[index++], p, plen + 1);
else
fprintf (stderr, "error: string exceeded MAXC\n");
}
}
}
使用for循环
您可以更有效地使用for
循环执行相同的操作:
while (fgets (data, 255,fp)
{
char *p = data;
for (p = strtok (data, ","); index < MAXL && p; p = strtok (NULL, ",\n"))
{
size_t plen = strlen (p);
if (plen + 1 < MAXC)
strncpy (array[index++], p, plen + 1);
else
fprintf (stderr, "error: string exceeded MAXC\n");
}
}
注意:通过在复制到阵列之前确认长度plen
,您可以确保您的字符串 nul-terminated 。如果您还有其他问题,请与我们联系。