C言語:小文字を大文字に変換する関数を作成

このQ&Aのポイント
  • C言語において、文字列中の小文字を大文字に変換する関数を作成する方法について教えてください。
  • 初心者向けの分かりやすい方法で、文字列中の小文字を大文字に変換する関数を作成する方法を教えてください。
  • C言語超初心者が、文字列中の小文字を大文字に変換する関数を作成する方法について質問です。
回答を見る
  • ベストアンサー

C言語:小文字を大文字に変換する関数を作成

C言語超初心者です。学校の課題で次のような問題が出されました。 ・問題・ 次に挙げる縛りに沿い、以下の関数とメイン関数を作り、処理結果を画面に作成しなさい。 char *tst(char *str) ・strの中の文字列も小文字を大文字に変換し、変換した文字列が格納されているchar *に返す。 ・引数strの中の文字列は受け取った状態で手を加えない。 ・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ・malloc関数を使用する。 ---------------------------------------------------------------------------------- 大文字に変換するには while(*str != '\0') { if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } ++str; } というのは分かったのですがここから何をすするか全く分かりません。初心者なのでなるべく分かりやすく教えてもらえると有難いです。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

>というのは分かったのですがここから何をすするか全く分かりません。  というのが分かって、「ここから何をすするか全く分かりません」てのは、ヘン。 過去の「質問」を検索(「大文字に変換」、「malloc」)して、作ってみました。 >小文字を大文字に変換  http://okwave.jp/qa/q3295844.html  #7 さんの「素直に標準関数(touuper)を使うのが吉」を採用。 >malloc関数を使用する。  http://okwave.jp/qa/q5651516.html  ここの確保量 200 の代わりに、strlen( str ) を使用。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> char *tst( char *str ) {  int iLen;  char *cap;  iLen = strlen( str );  cap = (char *)malloc( iLen + 1 );  if( NULL == cap ){ // ここ、「課題」なら必要かも   fprintf( stderr, "メモリ確保失敗" );   exit( 9 );  }  while( *str ){   *cap = toupper( *str );   cap++;   str++;  }  *cap = '\0'; // 文字列終端  return( cap - iLen ); } int main() {  char *ans;  char str[ 64 ] = "htTp://okwaVe.jp/QA/q5651516.html";  ans = tst( str );  printf( "%s\n", str );  printf( "%s\n", ans );  free( ans ); // 確保領域解放  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

iLen は int ではなく size_t の方がよろしいかと>#5. あと, 「関数内で exit」はきれいじゃない. そこは return 0; の方が便利じゃないかな.

  • tossy2011
  • ベストアンサー率17% (3/17)
回答No.4

まずは文字コード表を見て文字の並び方を学ぶとよいと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あと余談だけど if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } は全然ダメ. 問題外と言ってもいい. 文字コードに関する指定が全くされていない以上, 「どんな文字コードでも動く」ようにしなきゃ.

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 >・malloc関数を使用する。 ここは、どういうソースを書けばいいかわかりますか? 後ろの項目は前の項目に含まれますので、 >・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ここだけを考えればいいですね。

xg2ig254
質問者

補足

そうです!! 説明が悪くてすみません。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

それだと、str の指す文字列を変更してしまうからダメだよ。 「別の場所」に結果を格納するんだ。

関連するQ&A

  • C言語の変換する関数について教えてください。

    キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する #include <ctype.h> #include <stdio.h> void name_toupper(char str[]) { unsigned i = 0; while (str[i]) { str[i] = toupper(str[i]); i++; } } void name_tolower(char str[]) { unsigned i = 0; while (str[i]) { str[i] = tolower(str[i]); i++; } } int main(void) { char str[100]; printf("文字"); scanf("%s", str); name_toupper(str); printf("大文字: %s\n", str); name_tolower(str); printf("小文字: %s\n", str); return 0; } 自分で作った上のプログラムではKa siと入力すると(1)ではKA、(2)ではkaと表示されsiが消えてしまいます。原因がよくわかりません。 あと(3)ができないし、ただしを満たしているのかもあいまいです。 文字列の入力の形式:char *gets(char *buffer)を用いればどうにかなるのではと思っていますがどうですか? 説明が長くなって申し訳ありませんが教えてください。 よろしくお願いします。

  • 文字列strの中から文字cを探すプログラム(C言語)がわからない

    文字列strの中から文字cを探すプログラム(C言語)がわからない 柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。 僕が書いたプログラムを載せます。 /* 文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、 その文字へのポインタを返し、含まれていなければNULLを返す関数 char *str_chr(const char *str, int c) {} を作成せよ。 */ #include<stdio.h> char *str_chr(const char *str, int c){ while(*str){ if(*str==c) return str; str++; }     return NULL; } int main(){ char *str; char c; scanf("%s",str); scanf(" %c",c);     printf("%d",str_chr(str,c)); return 0; } コンパイラは「関数str_chrのif分の中のreturn strの型変換に問題がある」と言っているんです。 型変換はしるつもりは無いのにコンパイラはなぜそのように認識するのでしょうか。 またネット答えを探しましたがどうやらこのreturn strの部分はreturn (char*)strが正解のようです。意味がわかりません。strはポインタなのになぜまたわざわざchar型に変換しているのですか?といか(char*)の意味が根本的にわかりません。 質問ばかりですみません。初心者でポインタがどうにも理解できないんです。 誰か詳しい人教えてください。 お願いします。

  • C言語 strstrの実装

    課題で strstr()と同じ働きをするmy_strstr()を実装しなさいという課題がでています。 strstr()は char *strstr(const char *s1, const char *s2) という形で、 文字列s2が文字列s1の中に含まれていれば、文字列1の文字列2が含まれている先頭のアドレス(ポインタ)を返す関数です。(すいません、説明が下手で) 例えば、 strstr(Japanese, pan)は Japanese にpan が 含まれるのでpan 以降の文字列を返します→panese *********************** 質問ですが、 strstrの実装は完成して、正常に動くのですが 警告がでてきます。 str1= Japanese str2 = pan とすると、 私のプログラムでは、次のようなプロセスで動きます。 一文字ずつ調べる ↓ str1のJと str2の pを比較        J != p → str1++; //str1の次の文字へ str1のaと str2の pを比較        a != p, str1++; //str1の次の文字へ str1のpと str2の pを比較        p == p, rec = str1 // str1のアドレスを記録         str1++; str2++; //次の文字へ str1のaと str2の aを比較        a == a, str1++; str2++; //次の文字へ str1のnと str2の nを比較        n == n, str1++; str2++; //次の文字へ str1のeと str2 nullを比較    *str2 = null //search 終了。 return rec; とこんな感じです。 このプロセスの3行目の rec = str1; つまり、関数の戻り値のために記録したstr1のところで、 「問題のあるポインタ変換」 という警告がでます。 これは s1がconstだからでしょうか? どのようにしたらこの警告が消えるでしょうか? どなたかよろしければアドバイスをいただけませんか。 お願いします。

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • C言語のmemcpy関数について質問します。

    C言語のmemcpy関数について質問します。 以下のプログラムを作成して実行したのですが期待した動作が行えません。 どなたか原因が分かる方がいましたらアドバイスいただければと思います。 (期待する動作) STR_Bに"aaaa"を格納したい (現在の動作) STR_Bに"aaaabbbb"が格納される。 (printfで"aaaabbbb"が表示される) (以下プログラムです) char *STR_A = "aaaabbbb"; char *STR_B; /* 初期化 */ memset(&STR_B,0x00,sizeof(STR_B)); /* 文字列コピー */ memcpy(&STR_B,&STR_A,4); /* コピーした文字の表示 */ printf("STR_B = %s\n",STR_B);

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語の変換する関数について教えてください。

    キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する。 #include <ctype.h> #include <stdio.h> void name_toupper(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = toupper(istr[i]); i++; } } void name_tolower(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = tolower(istr[i]); i++; } } void name_change(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { if(isupper(istr[i])) { ostr[i] = toupper(istr[i]); } else { ostr[i] = tolower(istr[i]); } i++; } } int main(void) { char buffer[100]; printf("文字"); gets(buffer); name_toupper(buffer); printf("大文字: %s\n", buffer); name_tolower(buffer); printf("小文字: %s\n", buffer); name_change(buffer); printf("大小交換: %s\n", buffer); return 0; } 上のプログラムでは、呼び出し時のパラメータが足りないとエラーが発生してしまいます。文字列を入れておく配列をbuffer以外にもう一つ作らなくてはいけないと思うのですが、うまくいきません。 教えてください。よろしくお願いします。

  • 文字を置き換える関数で分からないことがあります。

    文字列strの中にある、文字列bagと共通の文字を空白に置き換える関数とその動作を確認するための、空白に置き換えた文字列strを表示するプログラムですが、戻り値が正しくないそうです。 ヒントでもいいのでどう直せばいいのかどなたかお教え下さい。 #include <stdio.h> char str_space(char str[], char bag[]){ int a, b, c, d; for(a = 0; a <= 99; a++){ if(str[a] == '\0'){ c = a; break; } } for(a = 0; a <= 99; b++){ if(bag[a] == '\0'){ d = a; break; } } for(a = 0; a <= c; a++){ for(b = 0; b <= d; b++){ if(str[a] == bag[b]){ str[a] = ' '; } } } return str[]; } int main(void){ char str[100], bag[100]; scanf("%s", str); scanf("%s", bag); printf("%s", str_space(str, bag)); return 0; }

  • C言語で文字列をかえす正しい書き方が知りたいです?

    C言語で次の警告が表示されます。 文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか? jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。 char *test(char *a, int b) { char str[BUFSIZ]; return str; <------ }

  • C言語の問題があと少しでわからないのですが

    学校の課題に取り組んで分からないことろが出てきました。問題は以下のものです。 問題13 任意の文字列を(str)を入力して、削除文字を入力させ、strから削除文字を削除して表示しなさい。 出力例:str = abcd 削除文字:c →結果:abd というものです。 途中まで自分で考え ------------------------------------------------------------------------------------------------------------------- #include <stdio.h> void rmv(char *str, char c); int main(void) { char str[80]; int c; printf("文字列入力 : "); fgets(str, 80, stdin); printf("削除文字入力 : "); c = getchar(); void rmv(str, (char)c); printf("削除後文字列 : %s", str); return 0; } void rmv(char *str, char c) { while(*str) { if(*str == c) { while(*str) { *str = *(str + 1); ++str; } } ++str; } *str = '\0'; } --------------------------------------------------------------------------------------------------------- としましたが削除文字判定と文字つめのループ用に同じポインタを使っているので文字が一文字しか消えないと言われました。 解決方法にrmv関数内で別のポインタを用意し、if文内でコピー(例 p =str;)し次のwhile文内でこのポインタを用いて判定するというヒントを貰いましたが。自分で組んでいて上手く動きません。 どのように処理をしていけばいいでしょうか。 超初心者なので説明も付けていただくと有難いです。

専門家に質問してみよう