【问题标题】:function to create an array from a string in C without strtok在没有 strtok 的情况下从 C 中的字符串创建数组的函数
【发布时间】:2016-03-03 19:16:20
【问题描述】:

给定一个字符串“红、黄、蓝、绿”,我需要编写一个函数来创建一个以颜色为元素的数组。我无法找到有关此问题的信息,因为我不允许使用 strtok 或 string.h 中的任何字符串操作函数。有什么建议吗?

这是我的代码:

int findLength(char string[]){
    int l =0;

    for(l = 0; string[l]!='\0'; l++){

    }
    return l;
};


char *stringToArray(char string[]){
    int i = 0;
    int j = 0;
    char c = ',';
    int n = 0;
    int l = findLength(string);

    char *str = (char *)malloc(l * sizeof(char));

    while(string[i] != '\0'){
        if(string[i] == c){
            for(n = j; n < i; n++){
                str[j++] += string[n];
            }

        }
        i++;
    }
    printf("%s\n", str);
    str = '\0';
    return str;
}


int main(int argc, const char * argv[]) {

    char *string = "red, blue, green,";
    char *str = stringToArray(string);
    free(str);

    return 0;

}

【问题讨论】:

  • 你在your previous question之后有什么具体问题吗?
  • 到目前为止你的代码是什么?
  • @bruceg 我刚刚更新了我的代码。

标签: c arrays string function c-strings


【解决方案1】:

遍历字符串,直到找到逗号。然后将从开始到该点的所有内容复制到数组中的单独字符串中。

继续迭代,直到找到另一个逗号,然后将所有从上次中断的位置复制到现在的位置,复制到数组中的另一个字符串中。

重复直到到达字符串的末尾。此外,请务必在找到每个逗号后跳过所有空格。

【讨论】:

    【解决方案2】:

    找到字符串的长度后,您可以像这样循环遍历字符串:

    for(int i=1; i<size; ++i)
    

    然后你检查当前字符是不是字母,前一个是空格:

    if(string[i] >= 97 && string[i] <= 122 && string[i-1] == ' ') //assuming your string has only lower case letters
    

    然后你应该实现一个while循环,直到找到另一个空格或逗号,然后将所有内容放入新数组中。

    请记住,您的第一个单词是特殊情况,因为它前面没有任何空格。

    【讨论】:

    • string.length?请使用'a''z' 而不是幻数。
    • 你说得对,我忘了他不应该使用与字符串相关的方法。我现在就改一下。
    • 最好记住前面的字符而不是使用危险的string[i-1],那么第一个单词不必是“特殊情况”。
    【解决方案3】:

    [..] 一个以颜色为元素的数组 [..]

    这将是一个字符数组。或者,由于您不知道数组数组和单个数组的大小,因此您使用指针:

    char ** parts; // a pointer to a(n array of) pointer(s) to a(n array of) char(s)
    

    你需要为parts的第一个元素分配一些空间:

    parts = malloc(sizeof(*parts) * 1); // Space for one pointer, to start with
    

    现在,您使用某个指针 (point) 遍历输入字符串(字符串 = 指向字符数组的指针,最后一个字符的值为 '\0')。记住起始位置(使用指针start在输入字符串的第一个字符之前。 在迭代过程中,当您找到一个分隔字符(例如',')时,请计算startpoint 指针之间的字符数。如果大于 0,则为该数字 + 1 个字符分配内存,并将结果指针分配给 parts 的最后一个元素:

    // example for the first iteration, you need to change that 0
    parts[0] = malloc(numberOfCharacters + 1);
    

    最后,将startpoint 之间的所有内容复制到新分配的内存中。 strncpy 在这里会很有帮助(如果您不允许使用它,那么请自己编写一个替代品。不要不要将该逻辑放入您的标记化函数中)。

    start 设置为point

    如果您的输入没有结束,请在parts 中获得更多空间来存储更多指针:这可以使用realloc 完成。然后返回迭代,直到找到一个分隔字符(或字符串的结尾)。

    请务必检查每个(重新)分配。在您选择的参考文献中仔细阅读上述函数的条目(例如:http://en.cppreference.com/w/c)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2010-12-20
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多