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, " ");
}
这是一个已更改的,但是我如何初始化它,所以不会引起任何问题。
答案 0 :(得分:0)
@abhiarora您能否指导如何使用malloc在堆中分配该空间?
我写了一个小代码来说明做同一件事的三种方式。代码没有经过优化,高效,而且我还没有freed
在heap
上动态分配的内存。在这些方法的开头,我已经跳过了一些必需的检查。我假设您对问题陈述有更好的了解,并找出最适合您的应用程序的大多数情况。
我已经在Ubuntu 18.04
的{{1}}计算机上测试并编译了以下代码(gcc(Ubuntu 8.2.0-7ubuntu1)8.2.0)。
编译命令为gcc
。
gcc test.c -o test -Wall -Wextra
以下是每种方法的说明:
方法编号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:在此方法中,我一直在使用memcpy
中声明的strtok
函数。使用经过良好测试的c-standard函数可以减少所需的代码行数。
方法编号3::在此内存中,我分配了一个用于保存字符串的全局缓冲区,因此我们不需要分配动态内存。 在此方法的开头,我已经跳过了一些检查。该方法具有多种局限性。它不适用于子字符串大小超过#include <string.h>
(100
)的字符串,并且不能处理子字符串大小超过MAX_SUBSTRING_SIZE
(100
)的字符串它。另外,如果您的特定子字符串只有5个字符(如MAX_NUMBER_OF_SUBSTRING
),则Hello
个字符的存储空间被浪费了。因此,这不是一种有效的方法。
但是我遇到段错误和无效写入。
我建议您看看95
警告。确保已在compiler's
或使用命令行标志中启用了警告。
我已经学习了IDE
和valgrind
之类的工具。当调试我的段错误时,它们对我很有帮助。