函数在没有strtok的情况下从C中的字符串创建数组
function to create an array from a string in C without strtok
给定一个字符串 "red, yellow, blue, green" 我需要编写一个函数来创建一个以颜色作为元素的数组。我无法找到有关此问题的信息,因为不允许我使用 strtok 或 string.h 中的任何字符串操作函数。有什么建议吗?
这是我的代码:
int findLength(char string[]){
int l =0;
for(l = 0; string[l]!='[=10=]'; 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] != '[=10=]'){
if(string[i] == c){
for(n = j; n < i; n++){
str[j++] += string[n];
}
}
i++;
}
printf("%s\n", str);
str = '[=10=]';
return str;
}
int main(int argc, const char * argv[]) {
char *string = "red, blue, green,";
char *str = stringToArray(string);
free(str);
return 0;
}
遍历字符串直到找到逗号。然后将从开始到该点的所有内容复制到数组中的单独字符串中。
继续迭代,直到找到另一个逗号,然后将上次停下的所有内容复制到数组中的另一个字符串中。
重复直到到达字符串的末尾。此外,请务必在找到每个逗号后跳过任何空格。
找到字符串的长度后,您可以像这样遍历字符串:
for(int i=1; i<size; ++i)
然后检查当前字符是否为字母,前一个字符是否为 space:
if(string[i] >= 97 && string[i] <= 122 && string[i-1] == ' ') //assuming your string has only lower case letters
然后你应该实现一个 while 循环,循环直到找到另一个 space 或逗号并将所有内容放入你的新数组中。
请记住,您的第一个单词是特例,因为它前面没有任何 space。
[..] an array with the colors as the elements [..]
这将是一个字符数组。或者,因为您既不知道数组的数组也不知道单个数组的大小,所以您使用指针:
char ** parts; // a pointer to a(n array of) pointer(s) to a(n array of) char(s)
您需要为 parts
的第一个元素分配一些 space:
parts = malloc(sizeof(*parts) * 1); // Space for one pointer, to start with
现在,您使用某个指针 (point
) 迭代输入字符串(字符串 = 指向字符数组的指针,最后一个字符的值为 '[=14=]'
)。记住起始位置(使用指针 start
)输入字符串第一个字符 之前 的一个位置。
在迭代过程中,当您找到一个分隔字符(例如 ','
)时,请计算 start
和 point
指针之间的字符数。如果它大于 0,则为该数字 + 1 个字符分配内存并将结果指针分配给 parts
:
的最后一个元素
// example for the first iteration, you need to change that 0
parts[0] = malloc(numberOfCharacters + 1);
最后,将 start
和 point
之间的所有内容复制到新分配的内存中。 strncpy
在这里会有帮助(如果您不允许使用它,那么给自己写一个替代品。不要 将该逻辑放入您的标记化函数中。
将 start
设置为 point
。
如果您不在输入的末尾,获取更多 space 以在 parts
中存储更多指针:这可以使用 realloc
完成。然后返回迭代,直到找到您的分隔字符之一(或字符串的末尾)。
一定要检查每个(重新)分配。在您选择的参考文献中仔细阅读上述函数的条目(例如:http://en.cppreference.com/w/c)。
给定一个字符串 "red, yellow, blue, green" 我需要编写一个函数来创建一个以颜色作为元素的数组。我无法找到有关此问题的信息,因为不允许我使用 strtok 或 string.h 中的任何字符串操作函数。有什么建议吗?
这是我的代码:
int findLength(char string[]){
int l =0;
for(l = 0; string[l]!='[=10=]'; 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] != '[=10=]'){
if(string[i] == c){
for(n = j; n < i; n++){
str[j++] += string[n];
}
}
i++;
}
printf("%s\n", str);
str = '[=10=]';
return str;
}
int main(int argc, const char * argv[]) {
char *string = "red, blue, green,";
char *str = stringToArray(string);
free(str);
return 0;
}
遍历字符串直到找到逗号。然后将从开始到该点的所有内容复制到数组中的单独字符串中。
继续迭代,直到找到另一个逗号,然后将上次停下的所有内容复制到数组中的另一个字符串中。
重复直到到达字符串的末尾。此外,请务必在找到每个逗号后跳过任何空格。
找到字符串的长度后,您可以像这样遍历字符串:
for(int i=1; i<size; ++i)
然后检查当前字符是否为字母,前一个字符是否为 space:
if(string[i] >= 97 && string[i] <= 122 && string[i-1] == ' ') //assuming your string has only lower case letters
然后你应该实现一个 while 循环,循环直到找到另一个 space 或逗号并将所有内容放入你的新数组中。
请记住,您的第一个单词是特例,因为它前面没有任何 space。
[..] an array with the colors as the elements [..]
这将是一个字符数组。或者,因为您既不知道数组的数组也不知道单个数组的大小,所以您使用指针:
char ** parts; // a pointer to a(n array of) pointer(s) to a(n array of) char(s)
您需要为 parts
的第一个元素分配一些 space:
parts = malloc(sizeof(*parts) * 1); // Space for one pointer, to start with
现在,您使用某个指针 (point
) 迭代输入字符串(字符串 = 指向字符数组的指针,最后一个字符的值为 '[=14=]'
)。记住起始位置(使用指针 start
)输入字符串第一个字符 之前 的一个位置。
在迭代过程中,当您找到一个分隔字符(例如 ','
)时,请计算 start
和 point
指针之间的字符数。如果它大于 0,则为该数字 + 1 个字符分配内存并将结果指针分配给 parts
:
// example for the first iteration, you need to change that 0
parts[0] = malloc(numberOfCharacters + 1);
最后,将 start
和 point
之间的所有内容复制到新分配的内存中。 strncpy
在这里会有帮助(如果您不允许使用它,那么给自己写一个替代品。不要 将该逻辑放入您的标记化函数中。
将 start
设置为 point
。
如果您不在输入的末尾,获取更多 space 以在 parts
中存储更多指针:这可以使用 realloc
完成。然后返回迭代,直到找到您的分隔字符之一(或字符串的末尾)。
一定要检查每个(重新)分配。在您选择的参考文献中仔细阅读上述函数的条目(例如:http://en.cppreference.com/w/c)。