前提
文字列単位で英大文字を小文字に変換する関数を自作しましたが、今一つ自信がありませんのでご助言を賜りたいです。
実現したいこと
文字単位のtolower()関数の文字列版を作るのが目的です。
- 入力する文字列をconst char *型の引数とする。
- 出力する文字列をchar *char型の戻り値とする。
発生している問題・エラーメッセージ
いろいろstr関係のライブラリ関数の仕様を見ていて、なんとなく引数にconst修飾子をつけたのですが、出力文字列を受けるsoutの初期化でsout = sin;とすると、
異なるconst修飾子です。
という警告が出ました。そこでなんとなく、sout = (char *)sin;とキャストすると、警告なくコンパイルでき、実行結果も問題ありませんでした。
しかし、上記のように「なんとなく」で進んできたので気持ち悪く、今一つ自信がありません。
ポインタを返す関数を自作するのは初めてなので、いろいろ不安です。
オーソドックスというか、エレガントというか、問題のないコーディング流儀をご教授いただきたいです。
よろしくお願いいたします。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <ctype.h> 5 6/* 文字列単位で英大文字を小文字に変換する関数 */ 7/* tolower()関数を使用する */ 8char *tolowerstr(const char *sin); 9 10int main(void) 11{ 12 char line[256]; 13 14 printf("文字列単位で英大文字を小文字に変換します。\n\n"); 15 printf("英文字列を入力してください。\n"); 16 fgets(line, sizeof line, stdin); 17 line[strlen(line) - 1] = '\0'; 18 19 printf("↓\n"); 20 printf("%s\n", tolowerstr(line)); 21 22 return EXIT_SUCCESS; 23} 24 25/* 文字列単位で英大文字を小文字に変換する関数 */ 26/* tolower()関数を使用する */ 27char *tolowerstr(const char *sin) 28{ 29 int i = 0; 30 char *sout; 31 sout = (char *)sin; 32 33 while(sin[i]) { 34 sout[i] = tolower(sin[i]); 35 i++; 36 } 37 38 return sout; 39}
実行結果
文字列単位で英大文字を小文字に変換します。 英文字列を入力してください。 ABC-Z ↓ abc-z
補足情報(FW/ツールのバージョンなど)
コンパイラ:Visual Studio 2022、OS:Windows10

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/30 01:10 編集
2022/08/29 06:12 編集
2022/08/29 06:10
2022/09/03 03:54