在c中使用strtok分裂字符串

时间:2014-02-03 21:26:56

标签: c strtok

嘿,我的代码出现问题,我创建了令牌并添加它,将令牌添加到2D阵列但是无法正常工作。不知道为什么。

/* strtok example */ 
#include <stdio.h>
#include <string.h> 
int main () 
{ 
char str[] ="This a sample string";
char * st[4][0];
char * pch;
int i; 
printf ("Splitting string \"%s\" into tokens:\n",str); 
pch = strtok (str," "); 
while (pch != NULL) 
{ 
printf ("%s\n",pch); 
pch = strtok (NULL, " ");
for(i=0;i<4;i++)
{
st[i][0]=pch;
}

}
print(st, i);
return 0;
}

void print(char st[4][0], int i)
{
for(i=0;i<4;i++)
{
printf("%d - %s",i ,st[i][0]);
}
}

2 个答案:

答案 0 :(得分:4)

char * st[4][0];

您正在分配一个零长度的数组。稍后您尝试访问第一个不存在的元素,因此您会得到未定义的行为。

我无法理解为什么这个数组有两个维度。您只能访问第二个维度的第一个元素,为什么不:

char * st[4];

...

更准确地说,我根本不了解这个变量的用法。为什么要在所有四个元素中写入相同的值?

答案 1 :(得分:1)

存在许多问题:与此代码比较:

/* strtok example */ 
#include <stdio.h>
#include <string.h> 

void print(char *st[4])  // Fixed parameter type
{
    int i; // i is a local counter
    for(i=0;i<4;i++)
    {
        printf("%d - %s\n",i ,st[i]);
    }
}

int main () 
{ 
    char str[] ="This a sample string";
    char * st[4];  // Corrected array definition
    char * pch;
    int i=0;       // Initialise counter i to 0
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," "); 
    while (pch != NULL) 
    { 
        st[i]=pch;   // Store string before overwriting pch, and only store in a single location
        printf ("%s\n",pch); 
        pch = strtok (NULL, " ");
        i++;         // increment i inside loop
    }
    print(st);
    return 0;
}