文字列に単語を追加するコードを書こうとしています。を\ 0で区切っています。 安定の最終的内容は、次のようになります。文字配列への文字列の追加とCの 0での分離
「単語\ 0int \ 0paper \ 0mushroom \ 0etc \ 0」
私の最初の考えは別の文字に単語を読むことであろう配列のtempWordを連結して連結しますが、どのようにそれらの間に\ 0を追加して保持することができますかsTable最後の配列をお尻?私はCに慣れていないので、事前に助けてくれてありがとう!
文字列に単語を追加するコードを書こうとしています。を\ 0で区切っています。 安定の最終的内容は、次のようになります。文字配列への文字列の追加とCの 0での分離
「単語\ 0int \ 0paper \ 0mushroom \ 0etc \ 0」
私の最初の考えは別の文字に単語を読むことであろう配列のtempWordを連結して連結しますが、どのようにそれらの間に\ 0を追加して保持することができますかsTable最後の配列をお尻?私はCに慣れていないので、事前に助けてくれてありがとう!
単語を受け取る単語配列の次の場所のポインタを保持することで、これを行うことができます。以下の関数add_word()
は、配列char
の配列と文字列へのポインタをとります。位置next
にwrd
を追加した後、ヌルターミネータの次の場所へのポインタが返されます。 next
ポインタには、最初に文字配列words[]
の最初の位置のアドレスが与えられます。ここでエラーをチェックすることはないので、呼び出し元は文字列が配列に収まるようにする必要があります。
#include <stdio.h>
#define MAX_SIZE 1000
char * add_word(char *next, const char *wrd);
int main(void)
{
char words[MAX_SIZE];
char *next = words;
next = add_word(next, "word");
next = add_word(next, "int");
next = add_word(next, "mushroom");
next = add_word(next, "etc");
for (char *ptr = words; ptr < next; ptr++) {
if (*ptr == '\0') {
printf("\\0");
} else {
putchar(*ptr);
}
}
putchar('\n');
return 0;
}
char * add_word(char *next, const char *wrd)
{
while (*wrd != '\0') {
*next++ = *wrd++;
}
*next++ = '\0';
return next;
}
プログラム出力:ここ
word\0int\0mushroom\0etc\0
がadd_word()
機能が追加されているワードの開始位置のインデックスを取るように改変された上記プログラムのバージョンであり、戻ると次の単語のインデックス。配列word_indices[]
も追加され、各単語の開始インデックスをwords[]
に追加して保存します。
#include <stdio.h>
#define MAX_SIZE 1000
size_t add_word(char *tokens, size_t next, const char *wrd);
int main(void)
{
char words[MAX_SIZE];
size_t word_indices[MAX_SIZE] = { 0 };
size_t next = 0, count = 0;
char *input[4] = { "word", "int", "mushroom", "etc" };
for (size_t i = 0; i < 4; i++) {
next = add_word(words, next, input[i]);
word_indices[++count] = next;
}
/* Show characters in words[] */
for (size_t i = 0; i < next; i++) {
if (words[i] == '\0') {
printf("\\0");
} else {
putchar(words[i]);
}
}
putchar('\n');
/* Print words in words[] */
for (size_t i = 0; i < count; i++) {
puts(&words[word_indices[i]]);
}
return 0;
}
size_t add_word(char *tokens, size_t next, const char *wrd)
{
while (*wrd != '\0') {
tokens[next++] = *wrd++;
}
tokens[next++] = '\0';
return next;
}
プログラムの出力:
word\0int\0mushroom\0etc\0
word
int
mushroom
etc
@ AlessandroLorusso--あなたが元の質問にあなたが保存された単語のインデックスを保存することに興味があるというコメントを述べたので、インデックスを使用して私の答えに保存するバージョンを追加しました。 –
ありがとう、あなたの答えは、これと私のプログラムの完成の私の理解を助けることに終わった。 –
あなたは、単一のchar型の配列にはかなり簡単に行うことができ、それだけで通常の「C文字列」ではありません。おそらく、あなたは何をしているのか、そしてなぜそれを記述する必要がありますか? – John3136
@ John3136私は入力から読み込んだ単語を1文字配列* sTable *に格納しようとしています(実際にはLexを使ってスキャナを作っていますので、単語はトークンになります)。言葉で分かるように、\ 0で区切られた* sTable *にそれらを追加したいと思います。また、単語を追加する際に、最初の文字のインデックスを別の変数(yylval)に格納しようとしています。 –
文字は 'sTable []'に追加されるので、 'sTable []'の使用量をどのように追跡するのが目的ですか? – chux