假设我从 stdin 得到一个字符串(一行)。 使用该行,我想从中创建一组字符串:
char ** array_of_strings
我希望这个字符串数组是行的数字。 例如,如果行输入是这样的:
"aasd1asdf4j 8 98"
数组将如下所示:
["1", "4", "8", "98"]
对于初学者来说,首先我将如何构建数组?我的想法是使用isdigit()
来检查数字何时开始,并制作指向那里的指针。 然后,当数字完成后,我将第一个非数字字符的字符值更改为"\0"。 我将在从行输入中获得的整个字符串中继续此过程。 但是,如何在不创建段错误的情况下将这些指针实际添加到我的array_of_strings array_of_strings因为未初始化
?这真的可以在不为array_of_strings分配任何额外内存的情况下完成吗? 我觉得它可以,因为array_of_strings只是持有指向已加载到内存中的字符串的指针。
我知道这不是一个代码编写服务,但是是否可以提供一些关于我如何构建这样的东西的例子?这在理论上对我来说是有意义的,但我什至不知道如何开始实施它。 我上面提供的描述是我目前最接近代码的东西。
创建array_of_strings后,是否可以使用数组语法访问其值(每个值均为 char * 类型)?喜欢:array_of_strings[0]
答案是需要动态内存分配,因为必须为每个指针分配空间。例如,如果字符串有 150 个数字,则需要一个包含 150 个指针的数组。但是,如果字符串有 100 万个数字,则需要一个包含 100 万个指针的数组,每个指针指向字符串中的正确位置。
如果你这样做array_of_strings实际上包含指向原始字符串内位置的指针,那么你首先需要计算你需要多少指针,不仅如此,你还需要存储每个子字符串的长度,或者每次需要从中读取时使用strpbrk。
另一种方法是使用 realloc,每次找到新的子字符串时,您都会重新分配 (n+1) 字符指针,然后分配适当的内存大小以将字符串复制到其中。代码看起来像这样(不完整):
char ** array_of_strings = NULL;
int n = 0;
char example[] = "aasd1asdf4j 8 98";
char numbers[] = "0123456789";
for(char* i = strpbrk(example, numbers) ; i != NULL ; i = strpbrk(i,numbers) )
{
int sizeOfNumSubstring = strspn(i, numbers);
if(array_of_strings == NULL)
{
array_of_strings = (char**)malloc(sizeof(char*));
*array_of_strings = (char*)calloc(sizeOfNumSubstring+1, sizeof(char));
}
else
{
array_of_strings = (char**)realloc(array_of_strings, (n+1)*sizeof(char*));
*(array_of_strings+n) = (char*)calloc(sizeOfNumSubstring+1, sizeof(char));
}
strncpy(*(array_of_strings+n), i, sizeOfNumSubstring);
n++;
i += sizeOfNumSubstring;
}
如果没有动态分配,则可以创建字符串数组。 在下面的代码中,它保存字符串中出现的每个数字,如果它被字符打断,我们转到下一个数组,依此类推
#define NUM_STRS 10
#define NUM_CRS 100
char *nums="0123456789 ";
char *str="aasd1asdf4j 8 98 ";
char arrstrs[NUM_STRS][NUM_CRS]={0};//array of 200 strings with 200 crs lenght
int nextString=0;
int nextChar=0;
char *pD=str;//pointer to line
while(1)
{
if(*pD==' ')/*break if null cr*/
break;
int k=0;
for (k=0;k<10;k++)
{
if(*pD==nums[k])
{
arrstrs[nextString][nextChar]=*pD;
nextChar++;
break;
}
}
/*If k is less than 10, continue in this same string */
if(k==10)/*If it reaches 10 means that it is not a number*/
{
if(nextChar)/*If something was added...*/
{
arrstrs[nextString][nextChar]=' ';/*close buffer*/
nextString++;/*go to next string*/
nextChar=0; /*reset to zero for new string*/
}
}
pD++;/*increment pointer*/
}
/*testing*/
for(int u=0;u<NUM_STRS;u++)
printf("%sn",arrstrs[u] );