说我从标准输入(一行)获得一个字符串。使用该行,我想从中创建一个字符串数组:
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]
答案 0 :(得分:0)
答案是您需要动态内存分配,因为您必须为每个指针分配空间。例如,如果字符串有150个数字,则需要150个指针的数组。但是如果字符串有100万个数字,你需要一个包含100万个指针的数组,每个指针指向字符串中的正确位置。
答案 1 :(得分:0)
如果你这样做,array_of_strings实际上包含指向原始字符串中的位置的指针,那么你首先需要计算你需要多少指针,不仅如此,你需要存储每个子字符串的长度,或者每个使用strpbrk你需要从中读取的时间。
另一种方法是使用realloc,每次找到一个新的子字符串,你重新分配(n + 1)个char指针,然后分配适当的内存大小来复制字符串。代码看起来像这样(不完整):
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;
}
答案 2 :(得分:0)
如果没有动态分配,可以创建一个字符串数组。 在下面的代码中,它保存了字符串中出现的每个数字,如果它被一个字符中断,我们将转到下一个数组,依此类推
#define NUM_STRS 10
#define NUM_CRS 100
char *nums="0123456789\0";
char *str="aasd1asdf4j 8 98\0";
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=='\0')/*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]='\0';/*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("%s\n",arrstrs[u] );