掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29639

リングバッファにおける文字列
投稿者---sai(2007/01/29 15:39:56)


char buff[256];

をキューと見立ててリングバッファを表現します。

文字列を順次入力していくのですが、どこからどこまでがひとつの文字列なのかを
表すために、先頭にヘッダを付けようと思うのですが、どのようにしたら良いので
しょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:リングバッファにおける文字列 29640 かずま 2007/01/29 19:18:12


No.29640

Re:リングバッファにおける文字列
投稿者---かずま(2007/01/29 19:18:12)


> 文字列を順次入力していくのですが、どこからどこまでがひとつの文字列なのかを
> 表すために、先頭にヘッダを付けようと思うのですが、どのようにしたら良いので
> しょうか?

先頭のヘッダとしては、文字の長さを入れればいいのではないでしょうか?

次のプログラムは、長さを入れる代わりに、末尾の '\0' で文字列を区切る
ものですから、参考程度に考えてください。
#include <stdio.h>
#include <string.h>

enum { CAPA = 256 };
char buff[CAPA];
int ep, dp, size;

int enque(const char *s)
{
    if (size + strlen(s) >= CAPA) return 0;
    do {
        size++;
        buff[ep] = *s;
        if (++ep == CAPA) ep = 0;
    } while (*s++);
    return 1;
}

int deque(char *s)
{
    if (size == 0) return 0;
    do {
        size--;
        *s = buff[dp];
        if (++dp == CAPA) dp = 0;
    } while (*s++);
    return 1;
}

int main(void)
{
    char str[256];

    while (scanf("%s", str) == 1)
        switch (str[0]) {
        case '+': 
            if (!enque(str+1)) puts("no space");
            break;
        case '-':
            if (!deque(str)) puts("empty"); else puts(str);
            break;
        case '.':
            return 0;
        default:
            puts("error: enter '+string', '-' or '.'");
        }
    return 0;
}



この投稿にコメントする

削除パスワード

No.29665

Re:リングバッファにおける文字列
投稿者---sai(2007/01/31 16:27:05)


ありがとうございます。
とりあえず、先頭ヘッダに文字数を入れてみようと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧