私は C で関数を記述しようとしています。この関数は、末尾が'\0'
文字列である連続文字へのポインターと単一の定数文字区切り文字を受け入れ、それぞれが新しい文字列を指す連続ポインターへのポインターを出力します。 . これらの新しい文字列は、各区切り文字で分割され、適切に終了する入力文字列に対応します。簡単に言えば、文字列の配列を動的に構築したいと考えています。
これを行うには、malloc() を使用して必要なメモリを割り当てる予定です。「親配列」はsizeof(char *) * (count + 2)
バイト長で、区切られた各部分文字列の最初の文字へのポインターとターミネーターを収容します。同様に、各「子配列」はsizeof(char) * (j + 1)
、各部分文字列のすべての文字にターミネータを加えた長さのバイトになります。
これまでの私のコードはこれです。
#include <stdio.h>
#include <stdlib.h>
char *split(char *string, const char delimiter);
int main(int argc, char *argv[]) {
char *x = split(argv[1], '.');
while (*x) {
printf("%d\n", *x);
}
return 0;
}
char *split(char *string, const char delimiter) {
int length, count, i, j = 0;
while(*(string++)) {
if (*string == delimiter) count++;
length++;
}
string -= length;
char *array = (char *)malloc(sizeof(char *) * (length + 1));
for(i, j = 0; i < (count + 1); i++) {
while(*(string++) != delimiter) j++;
string -= j;
*array = (char *)malloc(sizeof(char) * (j + 1));
while(*(string++) != delimiter) *(*array++) = *(string++);
**array = '\0';
string++;
array += sizeof(char *);
}
*array = '\0';
array -= (sizeof(char *) * (length + 1));
return array;
}
私の質問は、コンパイラが次のエラーを吐き出すのはなぜですか?
split2.c: In function ‘split’:
split2.c:25: warning: assignment makes integer from pointer without a cast
split2.c:26: error: invalid type argument of ‘unary *’ (have ‘int’)
split2.c:27: error: invalid type argument of ‘unary *’ (have ‘int’)
私の推測では、「親配列」のメモリが割り当てられると、コンパイラはそこに格納されるint
のではなく、値を期待します。char *
この場合、コードを正しく修正するにはどうすればよいですか?
を使用してこの種のことを行うはるかに簡単な方法があることは承知していますstring.h
。このコードを書く動機は、C でポインターがどのように機能するかをよりよく学ぶことです。
よろしくお願いします!