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

时间:2019-04-21 08:58:15

标签: c

            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;

            }

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

            int j = 0;
            char searchWord[20][20];
            char *ptr;
            ptr = strtok(buff, " ");
            while(ptr != NULL)
            {
                strncpy(searchWord[j][], ptr, 20);
                j++;
                ptr = strtok(NULL, " ");
            }

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

1 个答案:

答案 0 :(得分:0)

  

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

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

我已经在Ubuntu 18.04的{​​{1}}计算机上测试并编译了以下代码(gcc(Ubuntu 8.2.0-7ubuntu1)8.2.0)。

编译命令为gcc

gcc test.c -o test -Wall -Wextra

以下是每种方法的说明:

  1. 方法编号1:在这种方法中,我一直在使用#include <stdio.h> #include <string.h> #include <stdlib.h> int method1(const char *buffer, char *arrayOfPtr[50], const int MAX_NUM) { int ndx = 0; #define MAX_SIZE 200 char temp[MAX_SIZE + 1]; // Method 1 while (ndx < MAX_NUM) { int charRead = 0; if (sscanf(buffer, " %s%n", temp, &charRead) != 1) break; arrayOfPtr[ndx] = malloc(strlen(temp) + 1); if (arrayOfPtr[ndx] == NULL) break; memcpy(arrayOfPtr[ndx], temp, strlen(temp) + 1); buffer += charRead; ndx++; } return ndx; } int method2(const char *buffer, char *arrayOfPtr[50], const int MAX_NUM) { char *temp = malloc(strlen(buffer) + 1); memcpy(temp, buffer, strlen(buffer) + 1); int ndx = 0; // Method 2 while (ndx < MAX_NUM) { arrayOfPtr[ndx] = strtok(ndx ? NULL : temp, " "); if (arrayOfPtr[ndx] == NULL) break; ndx++; } return ndx; } #define MAX_NUMBER_OF_SUBSTRING 100 #define MAX_SUBSTRING_SIZE 100 char gBuffer[MAX_NUMBER_OF_SUBSTRING][MAX_SUBSTRING_SIZE]; int method3(const char *buffer, char *arrayOfPtr[50], const int MAX_NUM) { int ndx = 0; // Method 3 while (ndx < MAX_NUM) { int charRead = 0; if (sscanf(buffer, " %s%n", gBuffer[ndx], &charRead) != 1) break; arrayOfPtr[ndx] = gBuffer[ndx]; buffer += charRead; ndx++; } return ndx; } int main(int argc, char *argv[]) { char *bfr = "Hello World Stack Overflow"; char *arrayOfPtr[50]; int i; int size = method1(bfr, arrayOfPtr, sizeof(arrayOfPtr) / sizeof(arrayOfPtr[0])); for (i = 0; i < size; i++) printf("String: %d is \"%s\" of size %lu\r\n", i + 1, arrayOfPtr[i], (unsigned long)strlen(arrayOfPtr[i])); return 0; } 动态分配内存。我一直在使用malloc个大小为temp的字符数组来保存当前的c字符串。之后,我将动态分配所需大小的内存,并使用200从temp复制字符串。当大小大于200的子字符串已馈入函数时,此方法将无法处理。

  2. 方法2:在此方法中,我一直在使用memcpy中声明的strtok函数。使用经过良好测试的c-standard函数可以减少所需的代码行数。

  3. 方法编号3::在此内存中,我分配了一个用于保存字符串的全局缓冲区,因此我们不需要分配动态内存。 在此方法的开头,我已经跳过了一些检查。该方法具有多种局限性。它不适用于子字符串大小超过#include <string.h>100)的字符串,并且不能处理子字符串大小超过MAX_SUBSTRING_SIZE100)的字符串它。另外,如果您的特定子字符串只有5个字符(如MAX_NUMBER_OF_SUBSTRING),则Hello个字符的存储空间被浪费了。因此,这不是一种有效的方法。

  

但是我遇到段错误和无效写入。

我建议您看看95警告。确保已在compiler's或使用命令行标志中启用了警告。

我已经学习了IDEvalgrind之类的工具。当调试我的段错误时,它们对我很有帮助。