入力した文字を関数によって大文字に変える

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
saya

入力した文字を関数によって大文字に変える

#1

投稿記事 by saya » 12年前

コード:

#include<stdio.h>
#include<string.h>
char conv_A(char str);
 int main(void)
{
  char str[11];
  int i,s;
  printf("文字を入力してください");
  scanf("%s",&str);
  strcat( str," ");
  i=strlen(str);
  conv_A(char *str);
  for(s=0;s<i;s++)
    {
      printf("%s",str);
    }
  return 0;
}
  char conv_A(char str)
{ 
    int i;
	for(i=0;;i++)
    {   
		if(str[i]==NULL)
		{
			break;
		}
		if('a'<=str[i]&&str[i]<='z')
		{
			str[i]+=('A'-'a');
		}
    }
  return i;
}


入力した数字を大文字に変えて表示するプログラムなんですけど
エラーが出て終わってしまいます
文字数のiが問題だと思うんですけど
よくわからないです
教えてください

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 入力した文字を関数によって大文字に変える

#2

投稿記事 by beatle » 12年前

エラーというのは具体的に何でしょうか。

パッと見ると

コード:

conv_A(char *str);
の行がおかしいように思います。
関数の呼び出し方とプロトタイプ宣言を勉強してください。

saya

Re: 入力した文字を関数によって大文字に変える

#3

投稿記事 by saya » 12年前

(24): warning C4047: '==' : 間接参照のレベルが 'int' と 'void *' で異なっています。
というエラーでした

すこし直しました

コード:

#include<stdio.h>
#include<string.h>
char conv_A(char *str);
 int main(void)
{
  char str[11];
  int i,s;
  printf("文字を入力してください");
  scanf("%s",&str);
  strcat( str," ");
  i=strlen(str);
  conv_A(str);
  for(s=0;s<i;s++)
    {
      printf("%s",str);
    }
  return 0;
}
  char conv_A(char *str)
{ 
    int i;
	for(i=0;;i++)
    {   
		if(str[i]==NULL)
		{
			break;
		}
		if('a'<=str[i]&&str[i]<='z')
		{
			str[i]+=('A'-'a');
		}
    }
  return i;
}

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 入力した文字を関数によって大文字に変える

#4

投稿記事 by beatle » 12年前

http://dixq.net/forum/viewtopic.php?f=3&t=9614#p77558でもほとんど同じ事を書きましたが、ただ「直しました」と言われても、
「それで?」となるんです。まだエラーが出るならそのエラーを、エラーが出なくなった代わりに出力がおかしいならそのことを、
しっかり書いてくださらないと、対応できませんよ。

saya

Re: 入力した文字を関数によって大文字に変える

#5

投稿記事 by saya » 12年前

コード:

#include<stdio.h>
#include<string.h>
char conv_A(char *str);
 int main(void)
{
  char str[11];
  int i,s;
  printf("文字を入力してください");
  scanf("%s",&str);
  strcat( str," ");
  i=strlen(str);
  conv_A(str);
  for(s=0;s<i;s++)
    {
      printf("%s",str);
    }
  return 0;
}
  char conv_A(char *str)
{ 
    int i;
    for(i=0;;i++)
    {   
        if(str[i]==NULL)
        {
            break;
        }
        if('a'<=str[i]&&str[i]<='z')
        {
            str[i]+=('A'-'a');
        }
    }
  return i;
}
今この状態ですけど
出力が指定通りに大文字にならないです
どうしたらいいのでしょうか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 入力した文字を関数によって大文字に変える

#6

投稿記事 by beatle » 12年前

'A'の文字コードと'a'の文字コードを紙に書いて考えてみてください。
少なくとも'A'と'a'のどちらが大きいのか知らないといけません。

文字コードというのを知らないのでしたら、「ASCIIコード」とGOOGLEで検索すればいいと思います。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 入力した文字を関数によって大文字に変える

#7

投稿記事 by bitter_fox » 12年前

saya さんが書きました:

コード:

  char str[11];
  scanf("%s",&str);
char*[11]型を引数に渡していますが本当にこれでいいですか?
saya さんが書きました:

コード:

  char conv_A(char *str)
{ 
    int i;
  return i;
}
戻り値の型がchar型で宣言されているのにint型の変数を返しています
saya さんが書きました: 出力が指定通りに大文字にならないです
どうしたらいいのでしょうか?
具体的にどう大文字にならないのですか?

ちなみに今のアルゴリズムは、a-zが連続してることは規格で保証されていないので処理系依存なアルゴリズムになってますよ。
http://www.kijineko.co.jp/tech/supersti ... uence.html

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 入力した文字を関数によって大文字に変える

#8

投稿記事 by beatle » 12年前

bitter_foxさんが書かれているように、a-zまたはA-Zが連続していることを仮定するのは確かに処理系依存です。
「処理系」というのは、大雑把に言えば開発に使うOSとかコンパイラとかライブラリとかのことです。
a-z, A-Zが連続していない処理系も確かにありますが、しかしsayaさんレベルだと気にする必要は全くないと思います。

それよりもっと重大なのはbitter_foxさんも指摘している

コード:

  char str[11];
  scanf("%s",&str);
の問題や、

コード:

if(str[i]==NULL)
の問題です。

前者はbitter_foxさんが解説されているので、僕は後者を。

NULLは「無効な位置」を表すものです。より正確にはNULLは「空ポインタ」を表すマクロです。
それに対して、strは、「配列strのi番目の位置の値」です。strはchar型の配列ですから、strはchar型の値です。
すなわち、「char型の値」と「位置」という、全く異なるものを比較してしまっているのです。
http://dixq.net/forum/viewtopic.php?f=3&t=9614#p77563で示した例を使えば、
「1着のジーンズ」と「ジーンズ売り場の場所のメモ」を比較しているようなもんですね。

sayaさんがやりたいのは、おそらく文字列の最後を見つけることでしょうから、strと'\0'を比較すれば良いのです。
'\0'は「ナル文字」と言ってNULLと紛らわしいのですが、NULLと'\0'は全く別物です。

それから、bitter_foxさんも書かれているように、「具体的にどう大文字にならないの」かを是非書いてください。
投稿前チェックリストも是非参考にしてください。
「チェック1 : 課題の丸投げをしない」で書いたように、sayaさんが不具合に対処するために
どのように考えてどのように改造したのか、そこが知りたいです。

閉鎖

“C言語何でも質問掲示板” へ戻る