掲示板利用宣言

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

 私は

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

掲示板2

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

No.24992

文字配列を関数処理する方法で悩んでいます。
投稿者---Yuki(2005/12/27 21:42:19)


main関数でstr[][]という感じに文字配列を宣言し、
その文字配列を別関数で処理し、main関数で処理された内容を参照します。

以下に簡単な例を示します。かなり略して書いています。
void analysis(char str[][256])
{
  str[0]〜str[9]に何かしらの文字列を代入 ・・・
}

int main()
{
  char str[10][256]; /*宣言*/
  analysis(str);
  printf(str[0]〜str[9]);  /*略記:strの中身を全部表示*/ ・・・
  exit(0);
}

この場合、,派充┐気譴觀覯未箸靴董↓△能萢(代入)されたstrの内容が表示されればよいのですが。

関数の引数に***strを、main関数で呼び出すときに&strと記載するのも試しましたが駄目でした。

お手数ですが、ご回答いただければ幸いです。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字配列を関数処理する方法で悩んでいます。 24993 Hermit 2005/12/27 22:21:42
<子記事> Re:文字配列を関数処理する方法で悩んでいます。 24994 まきじ 2005/12/27 23:29:58
<子記事> Re:文字配列を関数処理する方法で悩んでいます。 24998 Yuki 2005/12/28 19:10:08


No.24993

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---Hermit(2005/12/27 22:21:42)


>以下に簡単な例を示します。かなり略して書いています。
で、表示できると思いますが・・・どう変なんでしょう?

#include <string.h>
void analysis(char str[][256])
{
  int i;
  char *abc = "abcdefghijklmnopqrstuvwxyz";
  for ( i = 0; i< 10; i++) {
    strcpy(str[i],&abc[i]);
  }
}
#include <stdio.h>
int main()
{
  char str[10][256]; /*宣言*/
  int i;
  analysis(str);
  for (i = 0;i < 10; i++)
  printf("%s\n",str[i]);  /*略記:strの中身を全部表示*/
  return 0;
}

で、
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
defghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
fghijklmnopqrstuvwxyz
ghijklmnopqrstuvwxyz
hijklmnopqrstuvwxyz
ijklmnopqrstuvwxyz
jklmnopqrstuvwxyz
の様になるのではいけないということ?


この投稿にコメントする

削除パスワード

No.24995

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---Yuki(2005/12/28 18:35:52)


strcpyを使わないで、str[][256]を直接いじって処理したいのです。
やはり、tempを使って置き換えねばいけませんか?


この投稿にコメントする

削除パスワード

No.24996

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---REE(2005/12/28 18:46:57)


>strcpyを使わないで、str[][256]を直接いじって処理したいのです。
>やはり、tempを使って置き換えねばいけませんか?

(strcpyを使って)str[][256]を直接いじっているサンプルです。
実際には、あなたの好きなように処理してください。

Hermitさんはあなたのしたい処理内容が分からないため、
strcpyを使った例を提示しただけでしょう。



この投稿にコメントする

削除パスワード

No.24994

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---まきじ(2005/12/27 23:29:58)


>関数の引数に***strを、main関数で呼び出すときに&strと記載する

二次元配列とポインタへのポインタは違います。
T 型の NxM の二次元配列を関数に渡す場合、
引数は T (*)[M] 型(T 型の M 個の配列へのポインタ)となります。


この投稿にコメントする

削除パスワード

No.24998

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---Yuki(2005/12/28 19:10:08)


解決しました。
私の説明不足と、注意不足が原因でした。

この関数の目的は、入力された文字配列input[ ]に対して、
区切り文字ごとに情報を分けて別の文字配列str[ ][ ]に返すというものです。
で、scanfを使ったのが間違いでした。

もしも、空白文字で区切られた文字配列(下記は例として)

set codeset JapaneseEUC

などを入力した場合、scanfで入力されるのは空白までの『set』なので
それを処理関数に渡して処理をしようとしても処理できないわけです。

getsを使いましたところ、区切り文字を目安に
文字配列が分解されましたので、問題は解決いたしました。

すごいドジなことをしてました。
大変ご迷惑をおかけいたしました。


この投稿にコメントする

削除パスワード

No.24999

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---まきじ(2005/12/28 23:00:06)


>getsを使いましたところ、区切り文字を目安に
>文字配列が分解されましたので、問題は解決いたしました。

gets() はオーバフローになる可能性があるので fgets() をお勧めします。


この投稿にコメントする

削除パスワード

No.25027

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---Yuki(2005/12/30 21:52:06)


>gets() はオーバフローになる可能性があるので fgets() をお勧めします。

私は、例としてgets()を使っただけです。
また、gets()とfgets()の使用方法は場合によって異なります。

例)
char input[1024];
printf("Input?:");
fgets(input);


この場合、input[]には、printf()で出力された文字"Input?:"も入ってしまいます。

gets()の場合は、"Input?:"は入らず、入力された文字だけとなります。

したがって、gets()の完全代用にfgets()を挿入する方法は、賢くないと思います。

私の実際のプログラムでは、Unix curses入力関数である

wgetnstr(WINDOW *window_ptr,char *str,int str_size)

を使っていますので、オーバーフローすることはありません。

この関数を使いますと、str_size以上打ち込んだ場合、
エラーとなります。


この投稿にコメントする

削除パスワード

No.25029

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---まきじ(2005/12/30 23:49:00)


>fgets(input);
>この場合、input[]には、printf()で出力された文字"Input?:"も入ってしまいます。

fgets(input,sizeof(input),stdin) で標準入力(キーボードなど)から
入力された文字を input に読み込むので画面に出力されいる文字列は
読み込みません。

標準出力(画面など)から読み込むには fgets(input,sizeof(input),stdout) とすれば
読み込めます。


この投稿にコメントする

削除パスワード

No.25040

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---YuO(2006/01/02 17:59:29)


>標準出力(画面など)から読み込むには fgets(input,sizeof(input),stdout) とすれば
>読み込めます。

それは無理では?
# 処理系によってはできるかもしれませんが……。

fgetsが要求するのは入力ストリームなのに,stdoutは出力ストリームなので,未定義動作かと。



この投稿にコメントする

削除パスワード

No.25042

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---まきじ(2006/01/02 23:58:24)


>fgetsが要求するのは入力ストリームなのに,stdoutは出力ストリームなので,未定義動作かと。

X3010 7.19.7.2 に
「stream が指すストリームから文字の列を読み取り s が指す配列に格納」
と記載されています。

「入力ストリームから」とは書かれていないので問題ないのでは?

一方 fgetc()(X3010 7.19.7.1) だと
「stream が指す入力ストリームから次の文字を返す」とあります。

以下のコードだと
hello world
-1
と出力されました。
/*
compiler : gcc 3.4.2 (mingw-special)
option : -std=iso9899:1999 -pedantic -O2 -Wall
*/
#include <stdio.h>
int main(void){

    int ch = 0;
    printf("hello world\n");
    while((ch = fgetc(stdout)) != EOF){
        putchar(ch);
    }
    printf("%d\n",ch);
}



この投稿にコメントする

削除パスワード

No.25043

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---YuO(2006/01/03 00:37:38)


>X3010 7.19.7.2 に
>「stream が指すストリームから文字の列を読み取り s が指す配列に格納」
>と記載されています。
>「入力ストリームから」とは書かれていないので問題ないのでは?

ISO/IEC 9899:1999 7.19.3 Files / Paragraph 11
The byte input functions read characters from the stream as if by successive calls to the fgetc function.

とあります。X 3010:2003のJISCの閲覧用PDFから同じ箇所によると,
バイト入力関数は,ストリームから文字を読み取る。入力は,fgetc関数の連続した呼出しによって読み取る場合と同じとする。

とのことです。fgetsは明らかに「the byte input function」ですから,fgetsの最終引数にはfgetcにおける条件が暗黙に仮定されて,バイト入力ストリームを渡さなければならない,ということになります。

ちなみに,VS2005において,fgets(buf, sizeof(buf) - 1, stdout)はヌルポインタを返します。
# bufはcharの配列型。



この投稿にコメントする

削除パスワード

No.25045

Re:文字配列を関数処理する方法で悩んでいます。
投稿者---まきじ(2006/01/03 01:00:01)


>バイト入力関数は,ストリームから文字を読み取る。入力は,fgetc関数の連続した呼出しによって読み取る場合と同じとする。

fgetc() の連続した呼び出しなんですね。
納得しました。ご指摘感謝です。


この投稿にコメントする

削除パスワード

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