在 C 中保存和访问指向字符串的指针



假设我从 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] );

相关内容

  • 没有找到相关文章