c - 尝试与strtok类似的拆分和存储数组

标签 c string strtok

对于类作业,我们被要求编写一个程序,该程序接受一个字符串和一个分隔符,然后接受“单词”并将它们存储在一个新的字符串数组中。即,输入(“我的名字是”,“”)将返回一个包含元素“我的”“名字”"is"的数组。

粗略地说,我尝试的是:

  1. 使用名为 number_of_delimeters() 的单独助手来确定字符串数组的大小

  2. 迭代初始数组以查找给定字符串中要放入数组中的元素数量

  3. 在数组中为每个字符串分配存储空间

  4. 将元素存储在分配的内存中

包含指令:

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

这是单独的助手:

int number_of_delimiters (char* s, int d)
{
    int numdelim = 0;
    for (int i = 0; s[i] != '\0'; i++)
    {
        if (s[i] == d)
        {
            numdelim++;
        }
    }
    return numdelim;
}

`这是函数本身:

char** split_at (char* s, char d)
{
    int numdelim = number_of_delimiters(s, d);
    int a = 0;
    int b = 0;

    char** final = (char**)malloc((numdelim+1) * sizeof(char*));

    for (int i = 0; i <= numdelim; i++)
    {
        int sizeofj = 0;
        while (s[a] != d)
        {
            sizeofj++;
            a++;
        }

        final[i] = (char*)malloc(sizeofj);
        a++;
        int j = 0;

        while (j < sizeofj)
        {
            final[i][j] = s[b];
            j++;
            b++;
        }

        b++;
        final[i][j+1] = '\0';
    }
    return final;
}

打印:

void print_string_array(char* a[], unsigned int alen)
{
    printf("{");
    for (int i = 0; i < alen; i++)
    {
        if (i == alen - 1)
        {
            printf("%s", a[i]);
        }
        else
        {
        printf("%s ", a[i]);
        }
    }
    printf("}");
}

int main(int argc, char *argv[])
{
    print_string_array(split_at("Hi, my name is none.", ' '), 5);
    return 0;
}

当前返回 {Hi, my name is none.}

经过一些研究,我意识到这个函数的目的与 strtok 相似或相同。然而,事实证明,查看源代码并没有多大帮助,因为它包含了我们尚未在类里面使用的概念。

我知道这个问题很模糊,代码也很难读懂,但是你能指出这种解决问题的方法会立即出现什么问题吗?

最佳答案

该程序有几个问题。

  1. while (s[a] != d) 是错误的,字符串中最后一个单词后面没有分隔符。
  2. final[i][j+1] = '\0'; 错误,j+1 多了一个位置。
  3. 返回的数组不可用,除非您事先知道其中有多少元素。

关于c - 尝试与strtok类似的拆分和存储数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43628224/

相关文章:

c++ - 即使我可以访问单个元素,也不在 C++ 中的字符串类数组中打印任何内容

java - 为什么当我尝试添加分割的字符串时得到空字符串?

c# - 仅基于子字符串过滤列表<字符串>

c - C 程序永远不会从 strtok() 函数返回的问题

c - 使用 strtok 拆分句子时内存泄漏

c - 休眠小于 1ms

c++ - C/C++ 程序的最大堆栈大小?

C 连续二维数组指针运算的泛型函数

c - Langford 序列实现 Haskell 或 C

C strtok 没有按照我的意愿进行解析