gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:12:23 25 4
gpt4 key购买 nike

            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, " ");
}

这是一个改变的,但是我该如何初始化它才不会造成任何问题。

最佳答案

@abhiarora Could you please guide how to allocate that space in the heap using malloc?

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

我已经在我的 Ubuntu 18.04 上测试并编译了下面的代码机器 gcc (海湾合作委员会 (Ubuntu 8.2.0-7ubuntu1) 8.2.0)。

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

#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;
}

下面是每个方法的解释:

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

  2. 方法二:在这个方法中,我一直在使用strtok#include <string.h> 中声明的函数.使用经过良好测试的 C 标准函数减少了所需的代码行数。

  3. 方法三: 在此内存中,我分配了一个全局缓冲区来保存字符串,因此我们不需要分配动态内存。 我在这个方法的开头跳过了一些检查。这种方法有各种限制。它不适用于子串大小超过 100 的字符串。 ( MAX_SUBSTRING_SIZE ) 并且无法处理超过 100 的字符串( MAX_NUMBER_OF_SUBSTRING ) 其中的子字符串。此外,如果您的特定子字符串只有 5 个字符(如 Hello ),则 95字符内存已被浪费。因此,这不是一种有效的方法。

However I am getting seg faults and invalid writes.

我建议看一下 compiler's警告。确保您已启用警告 IDE或使用命令行标志。

我学习了像 valgrind 这样的工具和 gdb .在调试我的段错误代码时,他们对我很有帮助。

关于c - 如何从一个长字符串中扫描多个字符串并将其存储在一个char *word[20]中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com