- ベストアンサー
C言語のポインターを使った大文字と小文字の入れ替えプログラム【解説付き】
- C言語のポインターを使って、文字列内の大文字と小文字を入れ替えるプログラムの説明と解説をご紹介します。
- 提供されたプログラムでは、入れ替え処理が正しく行われず、正しい結果が得られません。
- 処理の問題点を解説し、正しい入れ替え処理を行うプログラムを示します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
色々問題のあるコードですが、最初はそんなものです。 お互いに頑張っていきましょう^^ で、こんな感じでどうですか? //#pragma warning(disable:4996) //#include <iostream> #include<stdio.h> #include <ctype.h> void reverse(char *str) { int i; for (i = 0; i<26; i++) { if (*(str + i) >= 'a' && *(str + i) <= 'z') { //printf("=%c", *(str + i)); *(str+i)=toupper(*(str + i)); // //*(str+i) -= 'a' - 'A'; // toupper,tolowerを使いたくなければ } else if (*(str + i) >= 'A' && *(str + i) <= 'Z') { //printf("==%c", *(str + i)); *(str+i)=tolower(*(str + i)); //*(str+i) += 'a' - 'A'; } } return; } int main(void) { //char *str = "AddsssEEEEwwwJojoHoih"; これは絶対ダメ~。 char str[] = "AddsssEEEEwwwJojoHoih"; // charの文字列は配列で printf("変換前文字列 %s \n", str); reverse(str); printf("\n変換後文字列 %s \n", str); //std::system("pause"); return 0; }
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8765/19890)
#include<stdio.h> char *reverse(char *str) { char *p; for(p = str;*p;p++) { *p += ((*p >= 'A') && (*p <= 'Z')) ? 'a' - 'A' : ((*p >= 'a') && (*p <= 'z')) ? 'A' - 'a' : 0; } return(str); } int main(void) { int num; char data[]="AddsssEEEEwwwJojoHoih"; char *str = data; printf("Before reverse %s \n",str); str=reverse(str); printf("After reverse %s \n",str); return 0; } reverse関数は「与えた文字列の中身を書き換える」ので、リテラルな文字列へのポインタを与えてはいけない事に注意する事。 つまり char *str="AddsssEEEEwwwJojoHoih"; str=reverse(str); や str=reverse("AddsssEEEEwwwJojoHoih"); という事をしてはいけない。 char data[]="AddsssEEEEwwwJojoHoih"; と定義すれば、dataの場所は「書き換え可能な文字列」になり char *str = data; とstrに代入しても、strが指している文字列は書き換え可能なのでreverseに渡す事が可能。
お礼
ありがとうございます。
- mame_denkyu
- ベストアンサー率100% (1/1)
ごめん、確認用にアルファベット26文字でやってたので26のままにしてしまった>< 21に変更してください。 それと決め打ちはよくないのでsizeofで要素数を出してそれを関数に渡すようにするといいです。 その辺はがんばってみてください。
- int3
- ベストアンサー率34% (65/190)
void reverse(char* str)なのにreturnしてますけど。まずはcompileできるようにしないと。。 str[i]-0x20; とかもなにも代入してないので値も変わらないですし。 reverseがmemory確保してかえすものだとかりにするとこういうかんじでしょうか? #include<stdio.h> #include <stdlib.h> #include <string.h> char* reverse(char *str) { int i; char* buf = (char*)malloc(strlen(str)); for(i=0;str[i]!='\0';i++) { buf[i] = str[i]; if(str[i]>=0x61) { buf[i] = str[i]-0x20; } else if(0x40<str[i]<0x5B) { buf[i] = str[i]+0x20; } } return buf; }
お礼
有難うございます。頑張って勉強します
お礼
助かりました。有難うございます