みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

c言語 文字列と配列

#include<stdio.h>
int charlen(int n);
void cap2sml(int b);
int main()
{
char a[100],b[100];
int n,i;
/*Input CARACTERS*/
printf("CAPITAL?\n");
fgets(a,100,stdin);
charlen(n);
printf("total cahrs=%d\n",n); //printf in main
cap2sml(i);
printf("small=%s\n",b);
return(0);


int charlen(int n)
n=0;
while(1){
if(a[n]=='\0') break;
n++;
}


void cap2sml(int b)
int i;
for(i=0;a[i]!='\0';i++){
b[i]=a[i]+0x20;
}
b[i]='\0'


のプログラムでエラーがでるのですが、どこを直せばよいでしょうか?
ユーザー関数を使い文字列(大文字)を入力したときの文字列の長さと大文字を小文字に変化するプログラムです

投稿日時 - 2011-07-13 21:40:36

QNo.6874036

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>のプログラムでエラーがでるのですが、どこを直せばよいでしょうか?

回答者の皆さんが云われているように、間違い箇所数が多過ぎて手の施しようがありません。
特に、「関数とはどいうものか」をまったく理解していないために、初歩に戻り勉強し直す必要を感じます。
http://www.geocities.jp/ky_webid/c/030.html
また、ローカル変数とグローバル変数を理解していないため、変数の使い方もままならい状態にあなたがあるのがわかります。
http://www9.plala.or.jp/sgwr-t/c/sec12.html


>ユーザー関数を使い文字列(大文字)を入力したときの文字列の長さと大文字を小文字に変化するプログラムです

一見すると、「文字列の長さ」と「大文字を小文字にする」処理を行えということから、2つの関数を使わないとできないかのように見えますが、本当にそうなのでしょうか。
問いは、「大文字を小文字に変換し、文字列長さを返すユーザー関数を作れ」なのではないですか?

以下に回答例を示しますが、プロトタイプ宣言の仕方とローカル変数の使い方をじっくり見て学習してください。
http://www.pc.uec.ac.jp/sp/hshrkw/edu/program/b1/Ex5-1.htm
main()関数の文字配列a[] はあくまでも main()関数でしか使えないため、cap2sml()関数では a[]としても無効であるため、新たなローカル文字配列変数 temp_a[] として受け取っています。main()関数もcap2sml()関数も同じ a[]文字配列名を使っていると同じに見えてしまうため、あえて違う文字配列名にしてあるところを確認してください。
また、プロトタイプ宣言に「int cap2sml(char *temp_a);」とするという方もおられますが、初心者のうちは回答例の文字配列として処理している都合上、文字配列として受けるほうが間違いを少なくし、後のプログラミングに役立つと思うので、文字配列[] として受け取っています。
回答例は、あなたが考えたものよりずっとシンプルだと思います。すなわち、もっとリラックスしてプログラミングされることをお勧めします。





/* --- 実行結果 ---
CAPITAL? Hello
small=hello(5 chars)
*/
#include <stdio.h> // printf(), fgets()
#include <string.h> // strtok()
#define SIZE 100
/* プロトタイプ宣言 */
int cap2sml(char temp_a[]); // または int cap2sml(char []); 文字配列だ!!

int main(void){
/* Set local variables */
char a[SIZE]; // この main()関数にのみ有効なローカル変数
int n;
/*Input CHARACTERS*/
printf("CAPITAL? ");
fgets(a, SIZE - 2, stdin);
n = cap2sml(strtok(a, "\n")); //\n を \0 に置換したうえで cap2sml()をコール
printf("small=%s(%d chars)\n", a, n);
return 0;
}


int cap2sml(char temp_a[]){ // ローカル変数の文字配列で受け、int値を返す関数
/* Set local variables */
int i = 0;
/* Processing */
while(!(temp_a[i] == '\0')){ // 末尾でないなら処理を継続する
if(temp_a[i] >= 'A' && temp_a[i] <= 'Z'){ // 大文字なら小文字に
temp_a[i] += 0x20;
}
i++; // 添字をひとつ増やす(=文字長さをカウントしている)
}
return i; // カウントした文字長さを返す
}

投稿日時 - 2011-07-16 20:00:16

ANo.5

念のためですが, それで「一般に正しい動作は保証されない」ことは認識しているんですよね>#4.

投稿日時 - 2011-07-14 11:29:14

ANo.4

間違いだらけなので以下のソースコードと比較してみてください。

#include<stdio.h>

int charlen(char* a);
void cap2sml(char* b, const char* a);

int main()
{
char a[100],b[100];
int n;
/*Input CARACTERS*/
printf("CAPITAL?\n");
fgets(a,100,stdin);
n = charlen(a);
printf("total cahrs=%d\n",n); //printf in main
cap2sml(b, a);
printf("small=%s\n",b);
return(0);
}


int charlen(char* a)
{
int n=0;
while(1){
if(a[n]=='\0' || a[n]=='\n') break;
n++;
}
return n;
}


void cap2sml(char* b, const char* a)
{
int i;
for(i=0;a[i]!='\0' && a[i]!='\n';i++){
/*大文字なら小文字に変換*/
if( 'A' <= a[i] && 'Z' >= a[i] )
{
b[i]=a[i]+0x20;
}
/*大文字以外はそのままコピー*/
else
{
b[i]=a[i];
}
}
b[i]='\0';
}

投稿日時 - 2011-07-14 08:27:31

ANo.3

引数と返り値、グローバル変数とローカル変数の区別、関数の始まりと終わりが判っていないようですね。

mainの終わりはどこですか?
charlenの始まりは何処ですか?
cap2smlの始まりはどこですか?

以上は{}の対応がどうなっているかです。

mainで定義したaとbはcharlenとcap2smlで使えますか?

これはグローバル/ローカル変数の区別です。

int charlen(int n)
n++;

void cap2sml(int b)
b[i]=a[i]+0x20;

引数と返り値の問題ですが、n++でカウントした値はどうなりますか?
bとb[]の値はどうなりますか?
(どのようにmainに戻すのですか)

これは引数と返り値の問題です。

関数自体が判っていないのかもしれませんね。

投稿日時 - 2011-07-13 22:13:08

ANo.2

せめて{}くらいはちゃんとしましょうよ。
間違いや意味不明なのがいろいろあるけど、まずはそれから。

投稿日時 - 2011-07-13 22:08:25

ANo.1

>プログラムでエラーがでるのですが、どこを直せばよいでしょうか?

エラーが出る、だけじゃ何もわかりません。
何をしたときにどんなエラーが出るのか、「具体的に」
書いてください。

投稿日時 - 2011-07-13 21:43:06