ページ 1 / 1
入力した文字を関数によって大文字に変える
Posted: 2011年11月23日(水) 20:00
by saya
コード:
#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が問題だと思うんですけど
よくわからないです
教えてください
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月23日(水) 20:32
by beatle
エラーというのは具体的に何でしょうか。
パッと見ると
の行がおかしいように思います。
関数の呼び出し方とプロトタイプ宣言を勉強してください。
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月23日(水) 20:41
by saya
(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;
}
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月23日(水) 20:46
by beatle
http://dixq.net/forum/viewtopic.php?f=3&t=9614#p77558でもほとんど同じ事を書きましたが、ただ「直しました」と言われても、
「それで?」となるんです。まだエラーが出るならそのエラーを、エラーが出なくなった代わりに出力がおかしいならそのことを、
しっかり書いてくださらないと、対応できませんよ。
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月23日(水) 23:45
by saya
コード:
#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;
}
今この状態ですけど
出力が指定通りに大文字にならないです
どうしたらいいのでしょうか?
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月24日(木) 06:26
by beatle
'A'の文字コードと'a'の文字コードを紙に書いて考えてみてください。
少なくとも'A'と'a'のどちらが大きいのか知らないといけません。
文字コードというのを知らないのでしたら、「ASCIIコード」とGOOGLEで検索すればいいと思います。
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月24日(木) 08:47
by bitter_fox
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
Re: 入力した文字を関数によって大文字に変える
Posted: 2011年11月24日(木) 09:31
by beatle
bitter_foxさんが書かれているように、a-zまたはA-Zが連続していることを仮定するのは確かに処理系依存です。
「処理系」というのは、大雑把に言えば開発に使うOSとかコンパイラとかライブラリとかのことです。
a-z, A-Zが連続していない処理系も確かにありますが、しかしsayaさんレベルだと気にする必要は全くないと思います。
それよりもっと重大なのはbitter_foxさんも指摘している
コード:
char str[11];
scanf("%s",&str);
の問題や、
の問題です。
前者は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さんが不具合に対処するために
どのように考えてどのように改造したのか、そこが知りたいです。