掲示板利用宣言

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

 私は

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

掲示板2

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

No.24201

アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---ranp(2005/11/17 18:08:35)


アルファベットと数字以外の文字をすべて区切り文字としたいのですが、
どうすればいいのでしょうか。
どのように書くのかを教えていただけると助かります。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:アルファベットと数字以外の文字ををすべて区切り文字としたい 24202 あかま 2005/11/17 18:29:35
<子記事> Re:アルファベットと数字以外の文字ををすべて区切り文字としたい 24211 まきじ 2005/11/18 01:56:01


No.24202

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---あかま(2005/11/17 18:29:35)


isalnumを使えばいいと思いますよ。

#include <stdio.h>
#include <ctype.h>

int main(){
    char *s="a,b'c",*c;
    
    for(c=s;*c;c++){
        if(isalnum(*c)) printf("%c:区切り文字でない\n",*c);
        else printf("%c:区切り文字\n",*c);
    }
    return 0;
}




この投稿にコメントする

削除パスワード

No.24203

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---ranp(2005/11/17 19:17:00)


><pre>isalnumを使えばいいと思いますよ。

あかまさん回答ありがとうございます。


動作は
読み込んだ文字がアルファベットか数字ならば、その文字をエンキューし、それ以外の場合は、今、キューに格納されている文字をキューが空になるまでデキューして、一単語として出力する。
入力が終わるまでこれらを繰り返す。
というようにしたいのですが、isalnumの使い方はこれでいいのでしょうか?

do{
printf("データ:"); scanf("%d", &x);

if (QueueEnque(&que, x) == -1){
puts("データのエンキューに失敗しました。"); }
}while(isalnum(x));


if (QueueDeque(&que, &x) == -1)
puts("デキューできません。");
else
do{
QueueDeque(&que, &x);
printf("%s",x);
}while(isalnum(x));


この投稿にコメントする

削除パスワード

No.24204

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---あかま(2005/11/17 19:59:52)


文字を読み込むなら
char c;
scanf("%c",&c);
にしないとだめです。
isalnumは正しくはcharではなくintを渡すので気になるなら
isalnum((int)c);
とするか
int x = c;
isalnum(x);
とでもしておけばいいと思います。

あと出力は
printf("%c",x);
の間違いだと思います。それ以外は多分大丈夫かと。

あとソース貼り付けるときは「HTML変換ツール」を使ってください



この投稿にコメントする

削除パスワード

No.24218

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---ranp(2005/11/18 16:33:26)


>
文字を読み込むなら
char c;
scanf("%c",&c);
にしないとだめです。

char型にしてコンパイルをしたら、出力はされるようになったのですが、最初の一文字しか出なかったり
例えば abc def hijと入力した時に
>aだけしか出力されなかったり、
>bcとしか出力されなかったりするのですが、

動作としては、abc_def,hijなどと入力したときに、区切り文字で区切って
>abc
>def
>hij
と出力されるようにしたいのですが、、どこが悪いのでしょうか?

>あとソース貼り付けるときは「HTML変換ツール」を使ってください


すいませんでした。これでいいでしょうか?
ソースは、
int QueueIsEmpty(const Queue *q)
{
    return (q->num <= 0);
}


int main(void)
{
    Queue  que;
    char   x;
    if (QueueAlloc(&que, 100) == -1) {
        puts("キューの確保に失敗しました。");
        return(1);
    }

        printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que));
    
        printf("データ:"); 
    do{  
       scanf("%c", &x);
                 
                 if (QueueEnque(&que, x) == -1){
                    puts("データのエンキューに失敗しました。");  }
    }while(isalnum(x)&&QueueIsEmpty(&x));
    

         if (QueueDeque(&que, &x) == -1)
                    puts("デキューできません。");
                    else 
                    do{
                        QueueDeque(&que, &x);
                            printf("%c",x);
                        }while(isalnum(x)&&QueueIsEmpty(&x));
                        
            
        

    QueueFree(&que);

    return (0);

}

です。


この投稿にコメントする

削除パスワード

No.24222

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---まきじ(2005/11/18 23:35:55)


>最初の一文字しか出なかったり
>動作としては、abc_def,hijなどと入力したときに、区切り文字で区切って
>と出力されるようにしたいのですが

今はキューは置いといて、区切って二次元配列に格納していく様な
プログラムは作れますか?


この投稿にコメントする

削除パスワード

No.24283

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---ranp(2005/11/21 16:31:03)


>今はキューは置いといて、区切って二次元配列に格納していく様な
>プログラムは作れますか?

作れると思います。
けれど、今回は、キューを使って作りたいのですが、ヒントなどを教えていただけないでしょうか?


この投稿にコメントする

削除パスワード

No.24284

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---かずま(2005/11/21 17:54:14)


> 文字を読み込むなら
> char c;
> scanf("%c",&c);
> にしないとだめです。

c = getchar(); で十分です。


> すいませんでした。これでいいでしょうか?
> ソースは、

字下げが無茶苦茶ですね。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct {
    char *buf, *head, *tail;
    int  size, num;
} Queue;

int QueueAlloc(Queue *q, int size)
{
    return (q->head = q->tail = q->buf = malloc(size))
        ? (q->size = size, q->num = 0) : -1;
}

int QueueEnque(Queue *q, char c)
{
    return (q->num <= q->size) ? (*q->tail++ = c, q->num++) : -1;
}

int QueueDeque(Queue *q, char *c)
{
    return q->num ? (*c = *q->head++, q->num--) : -1;
}

void QueueFree(Queue *q)          { free(q->buf);   }
int QueueIsEmpty(const Queue * q) { return !q->num; }
int QueueSize(const Queue *q)     { return q->size; }
int QueueNo(const Queue *q)       { return q->num;  }

int main(void)
{
    Queue que;  char x, y;

    if (QueueAlloc(&que, 100) == -1)
        return puts("キューの確保に失敗しました。"), 1;

    printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que));
    printf("データ:");
    do {
        x = getchar();
        if (isalnum(x)) {
            if (QueueEnque(&que, x) == -1)
                puts("データのエンキューに失敗しました。");
        } else if (!QueueIsEmpty(&que)) {
            do {
                if (QueueDeque(&que, &y) == -1)
                    puts("デキューできません。");
                else putchar(y);
            } while (!QueueIsEmpty(&que));
            putchar('\n');
        }
    } while (x != EOF);
    QueueFree(&que);
    return 0;
}



この投稿にコメントする

削除パスワード

No.24285

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---かずま(2005/11/21 18:29:50)


> int QueueEnque(Queue *q, char c)
> int QueueDeque(Queue *q, char *c)

指摘される前に言っておきますが、本当の実装では、リングバッファに
しないといけませんよ。

それから、

    do {
        if (QueueDeque(&que, &y) == -1)
            puts("デキューできません。");
        else putchar(y);
    } while (!QueueIsEmpty(&que));

は、
    while (QueueDeque(&que, &y) != -1) putchar(y);

で十分です。



この投稿にコメントする

削除パスワード

No.24309

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---ranp(2005/11/22 12:48:32)


かずまさん回答ありがとうございます。

添付してもらったソースを実行してみたのですが、
>12: 'void *' 型は 'char *' 型に変換できない(関数 QueueAlloc(Queue *,int) )

というエラーが出て実行できないのですが、どこが違うのかわかりません。どう違うのでしょうか?

コンパイラは CPad for Borland C++,
OSはWindows XPです。

><pre>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct {
char *buf, *head, *tail;
int size, num;
} Queue;

int QueueAlloc(Queue *q, int size)
{
return (q->head = q->tail = q->buf = malloc(size))
? (q->size = size, q->num = 0) : -1;
}

int QueueEnque(Queue *q, char c)
{
return (q->num <= q->size) ? (*q->tail++ = c, q->num++) : -1;
}

int QueueDeque(Queue *q, char *c)
{
return q->num ? (*c = *q->head++, q->num--) : -1;
}

void QueueFree(Queue *q) { free(q->buf); }
int QueueIsEmpty(const Queue * q) { return !q->num; }
int QueueSize(const Queue *q) { return q->size; }
int QueueNo(const Queue *q) { return q->num; }

int main(void)
{
Queue que; char x, y;

if (QueueAlloc(&que, 100) == -1)
return puts("キューの確保に失敗しました。"), 1;

printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que));
printf("データ:");
do {
x = getchar();
if (isalnum(x)) {
if (QueueEnque(&que, x) == -1)
puts("データのエンキューに失敗しました。");
} else if (!QueueIsEmpty(&que)) {
do {
if (QueueDeque(&que, &y) == -1)
puts("デキューできません。");
else putchar(y);
} while (!QueueIsEmpty(&que));
putchar('\n');
}
} while (x != EOF);
QueueFree(&que);
return 0;
}
</pre>



この投稿にコメントする

削除パスワード

No.24322

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---まきじ(2005/11/23 00:00:29)


gcc で オプション -Wall を付けてコンパイルしてみましたが
エラー、警告はでませんでした。

>>12: 'void *' 型は 'char *' 型に変換できない

C 言語ではキャストは不要ですが、気になるなら
q->buf = malloc(size) を q->buf = (char*)malloc(size)
にすれば良いしょう。


この投稿にコメントする

削除パスワード

No.24349

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---ranp(2005/11/24 13:23:40)


まきじさん回答ありがとうございます。

その後同じものを自分で入力してつくってみたのですが、入力した文字を出力し終わったとき、いくつの単語が入力されたかを出力したいのですが、\0,NULL,EOFといろいろと試したのですがうまくいきません。
出力をすると
例えば、abc def;hijと入力すると
>abc
>def
>hij
と出力はされるのですが、終わりがなくずっとその状態が続いていて、単語の個数のカウントができないのですが、どうしたらいいのでしょうか。

ソースは、
    printf("データ:");
    do{ 
   x=getchar();
   if(isalnum(x)){
      if (QueueEnque(&que, x) == -1){
            puts("データのエンキューに失敗しました");}    
    }
    else if(!QueueIsEmpty(&que)){
        do{
     if (QueueDeque(&que, &x) == -1)
                    puts("デキューできません。");
                    else 
                    putchar(x);
                        }while(!QueueIsEmpty(&que));
                        putchar('\n');
                        count++;
    }
                       
    }while(x!='\0');
    
        QueueFree(&que);
        printf("入力された単語は%d個です。",count);
return (0);

}





この投稿にコメントする

削除パスワード

No.24211

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---まきじ(2005/11/18 01:56:01)


>アルファベットと数字以外の文字をすべて区切り文字としたいのですが、

strcspn() とか使えそう。

static char sep[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
size_t n = strcspn(str,sep);

な感じで・・
strcspn() については MSDN を参照


この投稿にコメントする

削除パスワード

No.24216

Re:アルファベットと数字以外の文字ををすべて区切り文字としたい
投稿者---まきじ(2005/11/18 11:04:07)


>strcspn() とか使えそう。

strspn() の間違いでした。

#include<stdio.h>
#include<string.h>

int main(void){

    static char sep[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    char str[]="abc#def&ghi'jkl(mno)pqr,stu";
    char *s, *p;
    
    for(p = str, s = p; *s; s = p){
        p = p + strspn(p,sep);
        *p++ = '\0';
        printf("%s\n",s);
    }
}



この投稿にコメントする

削除パスワード

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