C:将字符串数组分成单个单词

问题描述 投票:0回答:1

我有一个数组,里面装满了句子,我的数组是这样声明的

char *arraystr[size];

And由一个strtok填充,将一个字符串分成不同的句子并填充它。

arraystr[0]="In which class are you studying";

arraystr[1]="I am in Eighth Standard";

我想把句子逐字分开,存入数组或者矩阵中。像这样:

single_words[0]="In"

single_words[1]="which"

single_words[2]="class"

//...

我已经做到了,但是当没有什么可以分离的时候我遇到了崩溃,我猜它不知道什么时候停止。

我的代码:

void str_array_line(char str[],int *size,char* arraystr[])
{
    char *token = strtok(str, "?.!\n");
    int i=0;
    while(token!=NULL)
    {
        arraystr[i] = malloc(strlen(token) + 1);
        strcpy(arraystr[i], token);
        //printf("Array[%d][%s]\n",i, arraystr[i]);
        token = strtok(NULL, "?.!\n");
        i++;
        *size=i;
    }
}
void array_single_words(char *arraystr[],char* single_words[])
{
    int i=0,j=0;
    for(j=0;j<strlen(arraystr[j]);j++)
    {
        char *token = strtok(arraystr[j], " \t");
        while(token!=NULL)
        {
            single_words[i] = malloc(strlen(token) + 1);;
            strcpy(single_words[i], token);
            printf("Array[%d][%s]\n",i, single_words[i]);
            token = strtok(NULL, " \t");
            i++;
        }
    }
}

int main()
{
    char str[]="In which class are you studying?Sandhiya : I am in Eighth Standard. What about you?Saniya : I am in Ninth Standard\nSandhiya : Do you come to school by bus?\nSaniya : Yes. I travel by bus. I have to catch Route No 24 bus.\nSandhiya : It has passed on just 15 minutes before.";
    int size=sizeof(str);
    int i=0;
    char *arraystr[size];
    str_array_line(str,&size,arraystr);
    printf("Size: %d\n",size);
    char *single_words[255];
    array_single_words(arraystr,single_words);
}
c arrays string pointers matrix
1个回答
0
投票

我看到你的代码有几个问题。在

array_single_words
中,您正在遍历所有句子。所以
j
循环必须遍历
arraystr[]
数组中的句子数。

代替

for(j=0;j<strlen(arraystr[j]);j++)

你应该写

for(j=0;j<size;j++)

快速修复,因为在

str_array_line
的早期运行中,您将
size
设置为数组中的元素数。

话虽这么说,

malloc
数组的第一个
arraystr
的大小不应该是
size
,并且您重复使用同一个变量来表示不同事物的方式是有问题的,并且会让自己感到困惑。另外,考虑不要将数组大小作为函数参数中的副作用返回。

© www.soinside.com 2019 - 2024. All rights reserved.