掲示板利用宣言

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

 私は

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

掲示板2

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

No.24651

文字列の抽出と格納
投稿者---チョコチップ(2005/12/10 21:21:38)


早速ですが、途中まで作成したプログラムを見てください。
#include <stdio.h>

int main(void)
{
char a[] ="ab=cdef&gh=ijkl";
char b[4][10];
int i,j,m; //カウンタ変数

while(a[i] != 0)
//今回の質問部分

printf("文字列表示:")
for( i=0; i<4; i++)
printf("%s\n", b[i]);

return(0);
}

"="と"&"を抜かした文字列を抽出して、2次元配列のほうに
ab
cdef
gh
ijkl
のように出力したいのですが・・・
アドバイスお願いします!!


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列の抽出と格納 24652 まきじ 2005/12/10 21:34:44
<子記事> Re:文字列の抽出と格納 24674 Hermit 2005/12/11 00:12:55
<子記事> ★★★ソースの添付は字下げしてくださるようにお願いします 24706 管理人 2005/12/11 11:53:24


No.24652

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/10 21:34:44)


>"="と"&"を抜かした文字列を抽出して、2次元配列のほうに

一文字ずつ配列に格納していき '=' か '&' なら '\0' を格納。
これを元の文字列の '\0' まで繰り返す。


この投稿にコメントする

削除パスワード

No.24653

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/10 21:42:14)


アドバイスありがとうございました!
さっそくやってみます。


この投稿にコメントする

削除パスワード

No.24656

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/10 22:19:21)


>一文字ずつ配列に格納していき '=' か '&' なら '\0' を格納。
>これを元の文字列の '\0' まで繰り返す。

もう少し具体的に教えてもらうこと出来ますか?


この投稿にコメントする

削除パスワード

No.24657

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/10 22:35:06)


>もう少し具体的に教えてもらうこと出来ますか?

具体的にどこが判らないのですか?(全部はなしね)
出来た部分だけでもソースを提示してください。

大雑把には
while(文字列の終端でない間){
    while('&' '=' '\0' でない間){
        一文字代入;
    }
    ヌル文字代入;
}
な感じでしょうか。


この投稿にコメントする

削除パスワード

No.24659

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/10 22:57:03)


>具体的にどこが判らないのですか?(全部はなしね)
>出来た部分だけでもソースを提示してください。

>>while(str[i] != '\0'){
while(str[i] == '=' || str[i] == '&'){
data[i] = str[i];
}
data[i][j] = '\0';
}
ですかね?
最初に宣言してるカウンタ変数の使い方がいまいち・・・



この投稿にコメントする

削除パスワード

No.24660

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/10 23:21:33)


>while(str[i] == '=' || str[i] == '&'){

'=' か '&' の間繰り返すのですか?

>data[i] = str[i];

data が二次元配列なら data[?][j] の様な形になります。

>最初に宣言してるカウンタ変数の使い方がいまいち・・・

i 使い方もわからないですか?


この投稿にコメントする

削除パスワード

No.24661

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/10 23:25:33)


>i 使い方もわからないですか?

iはわかるのですが、kはいるのでしょうか?
一度実行してみたら、何も起きなかった・・・


この投稿にコメントする

削除パスワード

No.24666

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/10 23:49:24)


>一度実行してみたら、何も起きなかった・・・

「実行してみた」という事はコンパイルできたのですね?
コンパイルできたソースを提示して下さい。


この投稿にコメントする

削除パスワード

No.24668

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/10 23:54:26)


>「実行してみた」という事はコンパイルできたのですね?
>コンパイルできたソースを提示して下さい。

#include <stdio.h>

int main(void)
{
char a[] ="ab=cdef&gh=ijkl";
char b[4][10];
int i=0,j=0,m=0; //カウンタ変数

while(a[i] != 0){
while(str[i] == '=' || str[i] == '&'){
    data[i][j] = str[i];
}
data[i][j] = '\0';
}
printf("文字列表示:")
for( i=0; i<4; i++)
printf("%s\n", b[i]);

return(0);
}


この投稿にコメントする

削除パスワード

No.24670

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/11 00:02:46)


コンパイルできませんが?
str や data が宣言されていないですね・・


この投稿にコメントする

削除パスワード

No.24671

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 00:06:43)


>コンパイルできませんが?
>str や data が宣言されていないですね・

印字ミスですね・・
a[]→str[], b[]→data[4][10]の宣言に変えてください。



この投稿にコメントする

削除パスワード

No.24674

Re:文字列の抽出と格納
投稿者---Hermit(2005/12/11 00:12:55)


こんなんでもできます。
#include <stdio.h>
#include <string.h>

int main(void)
{
  char a[] ="ab=cdef&gh=ijkl";
  char b[4][10] = {""};
  int i;
  char *ptr;

  for (ptr = strtok(a,"=&"), i = 0; ptr; strcpy(b[i++],ptr), ptr = strtok(NULL,"=&"))
    ;
  printf("文字列表示\n");
  for( i=0; i<4; i++)
    printf("%s\n", b[i]);
  return 0;
}




この投稿にコメントする

削除パスワード

No.24678

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 00:23:05)


ポインタを使ったものですね!
確かに出来ましたが、先ほど掲載した宣言文どおりだったら、
私のプログラムではどこが間違っているのでしょうか?


この投稿にコメントする

削除パスワード

No.24681

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/11 00:26:45)


>私のプログラムではどこが間違っているのでしょうか?

i などがインクリメントされてないので無限ループになります。


この投稿にコメントする

削除パスワード

No.24682

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 00:42:39)


>i などがインクリメントされてないので無限ループになります。

ポインタを使わなくても
char str[] ="ab=cdef=gf=ijklm";
char data[4][10] = {""};
int i,j,k;
の宣言通りに作って実行できるのでしょうか?



この投稿にコメントする

削除パスワード

No.24689

Re:文字列の抽出と格納
投稿者---Hermit(2005/12/11 01:03:45)


str, data 自体、ポインタです。


この投稿にコメントする

削除パスワード

No.24691

Re:文字列の抽出と格納
投稿者---まきじ(2005/12/11 01:06:50)


>str, data 自体、ポインタです。

それは、少し語弊があるかも(^^;

str や data は、あくまで配列では?
ただし、「〜型へのポインタ」に成り下がることが可能。


この投稿にコメントする

削除パスワード

No.24692

Re:文字列の抽出と格納
投稿者---Hermit(2005/12/11 01:10:23)


>>str, data 自体、ポインタです。
>
>それは、少し語弊があるかも(^^;
>
>str や data は、あくまで配列では?
>ただし、「〜型へのポインタ」に成り下がることが可能。

そうかも(^^;
ということで、言い直し。

出来ます。


この投稿にコメントする

削除パスワード

No.24685

Re:文字列の抽出と格納
投稿者---Hermit(2005/12/11 00:50:30)


>ポインタを使ったものですね!
ポインタというより、ライブラリ関数の strtok() と、strcpy() を使ったと言った方がいいと思うのだけど。
>確かに出来ましたが、先ほど掲載した宣言文どおりだったら、
>私のプログラムではどこが間違っているのでしょうか?
i,jが増えていないので、同じ場所をずっとコピーし続けています。
str[i] と、data[i][j] と、i が同じなので、位置が非常にまずい事になります。
str[i] data[j][m] でないかな。
一文字進ませるため i,m を 1 増やす。
'&','=' が出て来ると、j が 1 増え、m が 0 に再設定されるようにすればいいのではないでしょうか。

あと、&= が二文字続く時どうするかなどの仕様もはっきりさせないといけないのかな?
strtok は、仕様で、二文字以上続くときはそのまま読み飛ばします。
(その仕様で書くと、結構面倒かも)

で、コンパイルできたソースを、と有ったら、コンパイルできるソースを提示しないと・・・
コンパイルが通らないソースは・・・ちょっと失礼な気がします。


この投稿にコメントする

削除パスワード

No.24694

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 01:20:27)


ありがとうございます!
ちょっとやってみますね。



この投稿にコメントする

削除パスワード

No.24697

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 01:38:37)


コンパイルできたソース↓
#include <stdio.h>

int main(void)
{
char str[] = "ab=cdef&gh=ijklm";
char data[4][20];
int i=0,j=0,m=0;

while(str[i] != '\0'){

data[j][m] = str[i];
i++;
m++;

if(str[i] == '=' || str[i] == '&'){
j++;
m=0;
}
data[j][m] = '\0';
}

printf("Extracted strings:\n");
for(i=0; i<4; i++){
printf("%s\n", data[i]);
}

return(0);
}

ですが、途中"フフフフ"という文字が出てしまいます・・・





この投稿にコメントする

削除パスワード

No.24699

Re:文字列の抽出と格納
投稿者---wiz(2005/12/11 02:03:46)


>ソースの添付は「HTML変換ツール」で字下げしてください。

data[j][m] = '\0';を挿入するタイミングなどが間違っています。




この投稿にコメントする

削除パスワード

No.24701

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 02:09:28)


>>ソースの添付は「HTML変換ツール」で字下げしてください。
>
>data[j][m] = '\0';を挿入するタイミングなどが間違っています。
>

使い方がいまいち把握できてなくてすいません(^ ^;
今、i++をk++の下に挿入したら解決しました。
これで予定通りの出力になったのでOKです。
アドバイスを下さった"まきじさん"や"Hermitさん","wizさん"
本当にありがとうございました♪




この投稿にコメントする

削除パスワード

No.24698

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 02:03:03)


while(str[i] != '\0'){

if(str[i] == '=' || str[i] == '&'){
j++;
k=0;        //←ここに何か追加する必要があるような気がするのですが・・
}

data[j][k] = str[i];
i++;
k++;

data[j][k] = '\0';
}

↑のままだと=と&が出力されてしまうので・・・


この投稿にコメントする

削除パスワード

No.24700

Re:文字列の抽出と格納
投稿者---wiz(2005/12/11 02:08:02)


continue文を使うことで対処できますが、その場合iのインクリメントが
実行されなくなってしまうのでif文の中でもiをインクリメントします。

#投稿するたびに変数名がかわってるのはいったい。。。?


この投稿にコメントする

削除パスワード

No.24702

Re:文字列の抽出と格納
投稿者---チョコチップ(2005/12/11 02:17:50)


度々の入力ミス申し訳ありませんでした。
今回の問題は皆さんのアドバイスで解決いたしました。
ほんとうにありがとうございました。
もしかしたら、また訪問するかもしれませんが
そのときはまたよろしくお願いします!!



この投稿にコメントする

削除パスワード

No.24704

Re:文字列の抽出と格納
投稿者---wiz(2005/12/11 02:41:25)


>度々の入力ミス申し訳ありませんでした。
>今回の問題は皆さんのアドバイスで解決いたしました。
>ほんとうにありがとうございました。
>もしかしたら、また訪問するかもしれませんが
>そのときはまたよろしくお願いします!!

この手のプログラム作る場合、ある程度の仕様や制限を
決めておかないと大変危険です。上のコードだと、
バッファオーバランなどの致命的なエラーが起こる可能性もあります。
#特に理由がないのであれば標準関数を使用することを進めます。。。

一応サンプルのせます。
コードの仕様は以下です
#抽出した文字列がMAX_LENGTHの文字数を越える場合は切り捨てる
#文字列の個数がMAX_STRNUMの個数を越える場合それ以上抽出は行わない
#&=など連続した場合は\0入れて文字数0の文字列1個としてカウントする

#include <stdio.h>

#define MAX_STRNUM 4   //格納データ最大個数
#define MAX_LENGTH 10  //格納文字最大数

int main(void)
{
    char str[] ="ab=cdef&gh=ijkl";
    char data[MAX_STRNUM][MAX_LENGTH] = { "" };
    int i, j, k; //カウンタ変数

    //今回の質問部分
    for( i=0, j=0; str[i]!='\0' && j<MAX_STRNUM; i++, j++ ){
        for( k = 0; str[i]!='=' && str[i]!='&' && str[i]!='\0' && k<MAX_LENGTH; i++, k++ ){
            data[j][k] = str[i];
        }
        data[j][k] = '\0';
    }

    printf("文字列表示:\n");
    for( i=0; i<MAX_STRNUM; i++)
        printf("%s\n", data[i]);

    return(0);
}





この投稿にコメントする

削除パスワード

No.24706

★★★ソースの添付は字下げしてくださるようにお願いします
投稿者---管理人(2005/12/11 11:53:24)


当掲示板の管理人です。

投稿上の注意をお読みの上、ソースの添付は字下げしてくださるようにお願いいたします。




この投稿にコメントする

削除パスワード

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