【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.19215

小文字→大文字、大文字→小文字
投稿者---葉崎弓子(2005/01/15 11:22:53)


初めまして。
今外部から入力した文字列を大文字を小文字に、小文字を大文字に変換するのを関数でやって、表示するプログラムを作っています。

自分では
#include<stdio.h>
char henkan(char);

void main(void)
{
char tako[64],takos[64];

printf("半角英数で63文字以内の文字列を入力してください:");
scanf("%s",tako);

takos = henkan(tako,i);

printf("%s",(char)takos);
}

char henkan(int i;char tako)
{
for(i=0;i<64;i++){
if(tako[i]==0) break;
else if(i>='A' && i<='Z')
return(i+'a'-'A');
else if(i>='a' && i<='z')
return(i+'A'-'a');
}
}
こんな感じでやったんですが(ダメダメ)、エラーと警告が1個ずつでて、しかもその意味も分からないので八方塞がりしています(;д;)

どなたか露骨に答えを示さなくても解く為の方向性を示していただけないでしょうか?(/д`)


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:小文字→大文字、大文字→小文字 19216 ぽこ 2005/01/15 12:30:51
<子記事> Re:小文字→大文字、大文字→小文字 19217 通りすがり。 2005/01/15 12:42:15
<子記事> Re:小文字→大文字、大文字→小文字 19218 BB 2005/01/15 12:48:16
<子記事> 続:小文字→大文字、大文字→小文字 19224 葉崎弓子 2005/01/16 13:54:24
<子記事> Re:小文字→大文字、大文字→小文字 19228 nop 2005/01/16 15:38:15


No.19216

Re:小文字→大文字、大文字→小文字
投稿者---ぽこ(2005/01/15 12:30:51)


>こんな感じでやったんですが(ダメダメ)、エラーと警告が1個ずつでて、しかもその意味も分からないので八方塞がりしています(;д;)

コンパイルエラーで詰まっている場合は、エラーメッセージを「そのまま」
乗せることをお勧めします。



この投稿にコメントする

削除パスワード

No.19217

Re:小文字→大文字、大文字→小文字
投稿者---通りすがり。(2005/01/15 12:42:15)


>char henkan(char);
>
>takos = henkan(tako,i);
>
>char henkan(int i;char tako)

とりあえず、関数定義・引数の個数が一致していないと思います。
また、char henkan(int i;char tako)の;は,の間違いです。
takosというのも、最初に配列で宣言しているので、takos[ ]という配列にしないといけません。

ざっと見ただけですが、とりあえずこれだけ・・・。


この投稿にコメントする

削除パスワード

No.19218

Re:小文字→大文字、大文字→小文字
投稿者---BB(2005/01/15 12:48:16)


※ソースの添付は「HTML変換ツール」で字下げ!
ちゃんと注意書きを読んでくださいね。
もし、あなたが全く字下げをせずにソースを書いたのなら、字下げをするようにしましょう。

>takos = henkan(tako,i);
プロトタイプ宣言とあっていません。
>printf("%s",(char)takos);
キャストしている意味は?
>char henkan(int i;char tako)
引数の区切りはセミコロンでなく、コンマ","です。
あと、iがどこにも宣言されてません。

ぱっと見た感じこんなところかな・・・

それと、ぽこさんが仰ってるように、エラー・警告が出る場合はそれをきちんと書きましょう。

#私が持ってるコンパイラ(gccとbcc)ではエラー・警告が一つどころではなく
#もっと出るのですが、どんなコンパイラ使ってるんでしょうか?


この投稿にコメントする

削除パスワード

No.19224

続:小文字→大文字、大文字→小文字
投稿者---葉崎弓子(2005/01/16 13:54:24)


すみません。
こういう掲示板に投稿するの初めてなので・・・(´д`;A
皆さんの話を受けて、こんな↓感じで
#include<stdio.h>
char henkan(char,int);

void main(void)
{
int i;
char tako[64],takos[64];

printf("半角英数で63文字以内の文字列を入力してください:");
scanf("%s",tako);

takos[i]= henkan(tako[i],i);

printf("%s",takos);
}

char henkan(char tako,int i)
{ 
for(i=0;i<64;i++){
if(i>='A' && i<='Z')
    return(i+'a'-'A');
else if(i>='a' && i<='z')
    return(i+'A'-'a');
}
}


変えてみました。
今度は投稿時に変換ツールを使わせて頂きました(^^;)
一応かろうじて実行はできるんですが、
入力して結果を出そうとすると

実行時エラー:12行目:不正なアドレス参照

と出て表示出来ません。
間違いを示唆して頂けると幸いです<(_ _)>


この投稿にコメントする

削除パスワード

No.19225

Re:続:小文字→大文字、大文字→小文字
投稿者---monkey(2005/01/16 14:10:50)


>実行時エラー:12行目:不正なアドレス参照

そのエラーの原因は、iの値が不定(main関数内で宣言のみして値が設定されていない)であるためと思われます。

このエラーとは直接関係ありませんが、henkan関数は1文字を変換するものなのでしょうか、それとも、文字列全体を変換するものなのでしょうか。
プロトタイプは前者を意図しているように見えますが、定義は後者を意図しているようです。
「文字」と「文字列」の違いに注意して見直してください。


この投稿にコメントする

削除パスワード

No.19226

Re:続:小文字→大文字、大文字→小文字
投稿者---monkey(2005/01/16 14:21:57)


>プロトタイプは前者を意図しているように見えますが、定義は後者を意図しているようです。

もとい。henkan関数の定義は意味不明ですね。
再検討を要します。


この投稿にコメントする

削除パスワード

No.19227

Re:続:小文字→大文字、大文字→小文字
投稿者---monkey(2005/01/16 15:07:30)


余計なコメントをして混乱させてしまったかも知れないので、お詫びに:
次のhenkan関数は、アルファベット1文字の大文字小文字を変換します。
ASCIIキャラクタセットであることが前提です。

#include<stdio.h>

#define SIZE 64

char henkan( char c )
{
    if( 'A' <= c && c <= 'Z' ){
        return c + 'a' - 'A';
    }
    if( 'a' <= c && c <= 'z' ){
        return c + 'A' - 'a';
    }
    return c;
}

void main(void)
{
    char tako[SIZE], takos[SIZE];
    int i;

    printf( "半角英数で%d文字以内の文字列を入力してください:\n", SIZE - 1 );
    scanf( "%s\n", tako );

    for( i = 0; i < SIZE - 1 && tako[i] != '\0'; i++ ){
        takos[i] = henkan( tako[i] );
    }
    takos[i] = '\0';

    printf("%s\n",takos );
}



この投稿にコメントする

削除パスワード

No.19230

Re:続:小文字→大文字、大文字→小文字
投稿者---葉崎弓子(2005/01/16 17:23:27)


ありがとうございます<(_ _)>
monkyさんもご自分で言っておられますが、
こちらは一文字ずつhenkan関数に飛んで判断して返すプログラムですね(´・ω・`)

一応みたところ理解出来るのでとても参考になりますが、
下の方に質問が・・・
void main(void)
{
char tako[SIZE], takos[SIZE];
int i;

printf( "半角英数で%d文字以内の文字列を入力してください:\n", SIZE - 1 );
scanf( "%s\n", tako );

for( i = 0; i < SIZE - 1 && tako[i] != '\0'; i++ ){
takos[i] = henkan( tako[i] );
}


[ takos[i] = '\0'; ]
↑この1文は何を表しているのでしょう?
初心者以下の質問をしてすみません(´д`;∩



この投稿にコメントする

削除パスワード

No.19231

Re:続:小文字→大文字、大文字→小文字
投稿者---葉崎弓子(2005/01/16 17:35:05)


ちなみにこちらのプログラム、mainを先に、henkanを後に書くとエラーが出ませんか?
さっき自分でこの順番に書いていると『12行目:henkanが定義されていません』とエラーが出るのですが・・・
mainを先に、henkanを後に書いても表示する方法はありますか?
逆に、逆にするとかろうじて動くのですが、変換されたものが表示される後に何やら文字化けした文字列があります。
これは前にも似たようなことあったので、私のパソコンだけで起こる現象かもしれません。

単純かと思われる質問をいっぱいしてすみません(>д<)

><pre>

#include<stdio.h>

#define SIZE 64

char henkan( char c )
{
if( 'A' <= c && c <= 'Z' ){
return c + 'a' - 'A';
}
if( 'a' <= c && c <= 'z' ){
return c + 'A' - 'a';
}
return c;
}

void main(void)
{
char tako[SIZE], takos[SIZE];
int i;

printf( "半角英数で%d文字以内の文字列を入力してください:\n", SIZE - 1 );
scanf( "%s\n", tako );

for( i = 0; i < SIZE - 1 && tako[i] != '\0'; i++ ){
takos[i] = henkan( tako[i] );
}
takos[i] = '\0';

printf("%s\n",takos );
}</pre>



この投稿にコメントする

削除パスワード

No.19232

Re:続:小文字→大文字、大文字→小文字
投稿者---じゃす(2005/01/16 18:01:21)


char henkan( char c );
と、プロトタイプ宣言すればいいと思います

それから、'\0'は文字列の終端文字です


この投稿にコメントする

削除パスワード

No.19237

Re:続:小文字→大文字、大文字→小文字
投稿者---葉崎弓子(2005/01/16 20:45:47)


>char henkan( char c );
>と、プロトタイプ宣言すればいいと思います
ありがとうございます<(_ _)>
>
>それから、'\0'は文字列の終端文字です
この場合、\0になると・・・break・・・ですか?省略可・・・?



この投稿にコメントする

削除パスワード

No.19238

完結?:小文字→大文字、大文字→小文字
投稿者---葉崎弓子(2005/01/16 20:50:07)


皆さんの助力を得て、
#include<stdio.h>
char henkan(char);

void main(void)
{
int i;
char tako[64],takos[64];

printf("半角英数で63文字以内の文字列を入力してください:");
scanf("%s",tako);

for(i = 0; i <= 63 && tako[i] !='\0';i++){
takos[i]= henkan(tako[i]);
}
printf("%s",takos);
}

char henkan(char a)
{ 
if(a>='A' && a<='Z'){
    return a+'a'-'A';
}
else if(a>='a' && a<='z'){
    return a+'A'-'a';
}
return a;
}

このようなプログラムで小文字→大文字、大文字→小文字の変換は出来ました。
が、私のパソコンでは結果が表示された後に何やら文字化けした文字が表示されます。
お手数でなければ、どなたか動作確認&間違いを指摘して頂けないでしょうか?


この投稿にコメントする

削除パスワード

No.19240

Re:完結?:小文字→大文字、大文字→小文字
投稿者---monkey(2005/01/16 21:03:44)


takosに格納された文字列の終端に'\0'がないからです。
私が示したサンプル中の

takos[i] = '\0';

は、文字列の終端に'\0'を加えるための処理であり、takosを文字列として扱う限り、省略してはいけない文です。

'\0'で文字列の終端を表すのはC言語の決まり事です。
文字列用の配列長を"64"としているのに、入力可能な文字数がそれより2少ない"63"なのは、最後の'\0'のための1文字分を残すためです。


この投稿にコメントする

削除パスワード

No.19242

Re:完結?:小文字→大文字、大文字→小文字
投稿者---monkey(2005/01/16 21:07:15)


>入力可能な文字数がそれより2少ない"63"なのは、

「1少ない」の誤記です^^;



この投稿にコメントする

削除パスワード

No.19241

Re:完結?:小文字→大文字、大文字→小文字
投稿者---monkey(2005/01/16 21:05:37)


致命的ではありませんが、main関数の最終行に

return 0;

を加えて下さい。
私のサンプルでも書き漏らしていました。ごめんなさい。


この投稿にコメントする

削除パスワード

No.19228

Re:小文字→大文字、大文字→小文字
投稿者---nop(2005/01/16 15:38:15)


>今外部から入力した文字列を大文字を小文字に、小文字を大文字に変換するのを関数でやって、表示するプログラムを作っています。

とりあえず、「ctype.h」で定義されている

 ・islower()
 ・isupper()
 ・tolower()
 ・toupper()

辺りを使用した方がよいかと思います。


この投稿にコメントする

削除パスワード

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