コンパイラ メッセージは私たちの友達です。私はあなたの問題を追跡するためにそれらを簡単に使用しました。 次のことを試して、実行したことと実行したことを比較してください。デカルレーションとポインター変数の使用に特に注意してください... :)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char **toArray(char **array, char str[], char sep[], int *count);
int main(int argc, char* argv[]) {
char test[] = "Hello there lol";
int count = 0;
char **array = malloc((sizeof(char*) * 5) +1); //added "+ 1" here, read why
toArray(array, test, " ", &count); //in comment below
printf("Count: %d\n", count);
int array_i;
for (array_i = 0; array_i < count; array_i++) {
printf("array %d: %s\n", array_i, array[array_i]);
//free(array[array_i]);
}
getchar();
free(array);
return 1;
}
char **toArray(char **array, char str[], char sep[], int *count) {
char *temp = str;
temp = strtok(temp, sep);
array[0] = temp;
*count = 1;
while ((temp = strtok(NULL, sep)) != NULL) {
array[(*count)++] = temp;
}
return array;
}
[編集]出力例:
また。 「hello」は実際には 5 文字と NULL 文字であるためこの行char **array = malloc(sizeof(char*) * 5);
が必要でした
。 char **array = malloc(sizeof(char*) * 5 + 1);
'\0'
C の string(s)に関するいくつかの経験則。
1) malloc または calloc を使用する場合は、忘れずに'\0'
.
`char *buf1;` //buffer needed to manipulate buf2
`char buf2[]="someString";`
`buf1 = malloc(strlen(buf2)+1);` or `buf1 = malloc(sizeof(buf2));`
(note:, no '+1'. see '4)' below. )
2)使用する前に、新しく割り当てられた変数をクリア (初期化) します。例えば:
memset(buf, 0, strlen("someString")+1); //preferred, all bytes are zeroed
また
buf[0]=0; //useful, but use with care (only first byte is zeroed.)
3)使用が終了したら、動的に割り当てられたすべてのメモリを解放します。例えば:
free(buf);
4)strlen()
関数またはsizeof()
マクロの使用。(どちらも での使用に人気があります[mc]alloc()
)
指定:
char *buf1 ="Hello"; //6文字 |H|e|l|l|o|\0|
char buf2[] ="こんにちは"; //6文字 |H|e|l|l|o|\0|
char buf3[5]="こんにちは"; //5 文字 |H|e|l|l|o|
char buf4[5]="Hel"; //4 文字 |H|e|l|\0| |
char buf5[5]="Helloo";// コンパイル エラーが発生するはずです。初期化子が多すぎます
結果の比較strlen() - sizeof()
:
strlen(buf1); //->5
("Hello\0" を保持するために必要な新しい変数の malloc に +1 が必要です)
sizeof(buf1); //->4
(文字列の # chars ではなく、sizof (char *) を返します)
strlen(buf2); //->5
(「Hello\0」を保持する必要がある新しい変数の malloc に +1 が必要です)
sizeof(buf2); //->6
(「\0」を含むすべての文字をカウントします)
strlen(buf3); //->
(エラー: 文字列引数に終端の NULL がありません)
sizeof(buf3); //->5
(すべての文字を数えますが、この文字列には '\0' がありません - 間違っています!)
strlen(buf4); //->3
(文字をカウントしますが、'\0' はカウントしません)
sizeof(buf4); //->5
('\0' を含むすべての割り当てられたスペースをカウントします)