を に変換しようとしChar*
ていChar**
ます。
たとえば"echo Hello World"
、{"echo", "Hello", "World"}
Char*
withから単一の単語を取得できることを知っていstrtok()
ます。
しかし、のサイズが不明であり、単一の単語のサイズも不明であるChar**
ため、 の初期化に問題があります。Char*
Yourchar**
は、最初のポインタchar *
(または、char ポインタの配列の先頭) です。char*[]
( !!と同じではありません) の割り当ては、より大きな問題になる可能性があります。このタスクにchar**
は使用する必要があります。malloc
事前に s の数がわからない場合は、char*
サイズを推測してNULL
s を入力し、必要なときに呼び出すことができrealloc
ます。
文字列を実行して ' ' (スペース文字) を検索すると、見つかった各スペースはstrncpy
、現在のスペース インデックスと最後のスペース インデックスの間の文字列を取得する関数を使用して部分文字列を取得できます。作成した各文字列は、「動的」配列 (malloc と realloc を使用) に格納できます。
最初の部分文字列の開始インデックスは 0 で、文字列の最後で、最後のスペース インデックスと文字列の長さの間の最後の部分文字列を取得します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
size_t word_count(const char *str){
enum { out, in } status;
size_t count = 0;
status = out;
while(*str){
if(isspace(*str++)){
status = out;
} else if(status == out){
status = in;
++count;
}
}
return count;
}
int main(void){
char original[] = "echo Hello World";
size_t i, size = word_count(original);
char *p, **words = (char**)malloc(sizeof(char*)*size);
for(i = 0, p = original;NULL!=(p=strtok(p, " \t\n")); p = NULL)
words[i++] = p;
//check print
printf("{ ");
for(i = 0;i<size;++i){
printf("\"%s\"", words[i]);
if(i < size - 1)
printf(", ");
}
printf(" }\n");
return 0;
}