如何从一个长字符串中扫描多个字符串并将其存储在char*word[20]中?

如何从一个长字符串中扫描多个字符串并将其存储在char*word[20]中?,c,C,buff数组包含一些字符串。例如,如果buff包含“helloworld”。结果应该是searchWord[0]=“hello”,searchWord[1]=“world”。我试图将每个单词从长数组移动到另一个指针数组。但是,我得到seg错误和无效写入。谢谢你的帮助 int res, charRead; char *ptr = buff; char *searchWord[20]; int j = 0

buff数组包含一些字符串。例如,如果buff包含“helloworld”。结果应该是searchWord[0]=“hello”,searchWord[1]=“world”。我试图将每个单词从长数组移动到另一个指针数组。但是,我得到seg错误和无效写入。谢谢你的帮助

            int res, charRead;
            char *ptr = buff;
            char *searchWord[20];
            int j = 0;
            while(1)
            {
                res = sscanf(ptr, "%s%n", searchWord[j] ,&charRead);
                if(res != 1)
                {
                    break;
                }

                printf("%s\n", searchWord[j]);
                j++;
                ptr = ptr + charRead;

            }
这是一个已更改的,但是如何初始化它以使其不会引起任何问题

@abhiarora您能指导如何使用malloc在堆中分配空间吗

我已经写了一个小代码来说明做同样事情的三种方法。代码没有得到优化,效率不高,而且我没有
释放
堆上动态分配的内存。在这些方法的开头,我跳过了一些必需的检查。我假设您对您的问题陈述有更好的了解,并找出最适合您的应用程序的大部分内容

我已经在我的
ubuntu18.04
机器上用
gcc
(gcc(ubuntu8.2.0-7ubuntu1)8.2.0)测试并编译了下面的代码

编译命令是gcc test.c-o test-Wall-Wextra

            int j = 0;
            char searchWord[20][20];
            char *ptr;
            ptr = strtok(buff, " ");
            while(ptr != NULL)
            {
                strncpy(searchWord[j][], ptr, 20);
                j++;
                ptr = strtok(NULL, " ");
            }
#包括
#包括
#包括
int method1(const char*buffer,char*arrayOfPtr[50],const int MAX_NUM)
{
int ndx=0;
#定义最大尺寸200
字符温度[最大大小+1];
//方法1
而(ndx
以下是每种方法的说明:

  • 方法1:在这个方法中,我一直在使用
    malloc
    动态分配内存。我一直在使用大小为
    200
    temp
    字符数组来保存当前的c字符串。之后,我动态分配所需大小的内存,并使用
    memcpy
    从temp复制字符串。此方法不处理大小超过200的子字符串已馈送到函数的情况

  • 方法2:在这个方法中,我一直在使用
    中声明的
    strtok
    函数。使用经过良好测试的c标准函数减少了所需的代码行数

  • 方法3:在这个内存中,我分配了一个全局缓冲区来保存字符串,这样我们就不需要分配动态内存了我跳过了此方法开头的一些检查。这种方法有各种局限性。它不能处理子字符串大小超过
    100
    MAX\u SUBSTRING\u size
    )的字符串,也不能处理子字符串大小超过
    100
    MAX\u NUMBER\u of_SUBSTRING
    )的字符串。此外,如果您的特定子字符串只有5个字符(如
    Hello
    ),则
    95个字符的内存已被浪费。所以,这不是一种有效的方法

  • 但是,我得到seg错误和无效写入

    我建议您看看
    编译器的
    警告。确保已在IDE中或使用命令行标志启用警告

    我学习过像
    valgrind
    gdb
    这样的工具。在调试seg故障代码时,他们对我非常有帮助

    @abhiarora您能指导如何使用malloc在堆中分配空间吗

    我已经写了一个小代码来说明做同样事情的三种方法。代码没有得到优化,效率不高,而且我没有
    释放
    堆上动态分配的内存。在这些方法的开头,我跳过了一些必需的检查。我假设您对您的问题陈述有更好的了解,并找出最适合您的应用程序的大部分内容

    我已经在我的
    ubuntu18.04
    机器上用
    gcc
    (gcc(ubuntu8.2.0-7ubuntu1)8.2.0)测试并编译了下面的代码

    编译命令是gcc test.c-o test-Wall-Wextra

                int j = 0;
                char searchWord[20][20];
                char *ptr;
                ptr = strtok(buff, " ");
                while(ptr != NULL)
                {
                    strncpy(searchWord[j][], ptr, 20);
                    j++;
                    ptr = strtok(NULL, " ");
                }
    
    #包括
    #包括
    #包括
    int method1(const char*buffer,char*arrayOfPtr[50],const int MAX_NUM)
    {
    int ndx=0;
    #定义最大尺寸200
    字符温度[最大大小+1];
    //方法1
    而(ndx