保存和访问C

时间:2017-05-12 00:46:53

标签: c arrays string pointers segmentation-fault

说我从标准输入(一行)获得一个字符串。使用该行,我想从中创建一个字符串数组:

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]

3 个答案:

答案 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] );