• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の、ポインターの問題を教えて下さい)

C言語のポインターを使った大文字と小文字の入れ替えプログラム【解説付き】

このQ&Aのポイント
  • C言語のポインターを使って、文字列内の大文字と小文字を入れ替えるプログラムの説明と解説をご紹介します。
  • 提供されたプログラムでは、入れ替え処理が正しく行われず、正しい結果が得られません。
  • 処理の問題点を解説し、正しい入れ替え処理を行うプログラムを示します。

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

  • ベストアンサー
回答No.2

色々問題のあるコードですが、最初はそんなものです。 お互いに頑張っていきましょう^^ で、こんな感じでどうですか? //#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; }

o-saka-iru
質問者

お礼

助かりました。有難うございます

その他の回答 (3)

回答No.4

#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に渡す事が可能。

o-saka-iru
質問者

お礼

ありがとうございます。

回答No.3

ごめん、確認用にアルファベット26文字でやってたので26のままにしてしまった>< 21に変更してください。 それと決め打ちはよくないのでsizeofで要素数を出してそれを関数に渡すようにするといいです。 その辺はがんばってみてください。

  • int3
  • ベストアンサー率34% (65/190)
回答No.1

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; }

o-saka-iru
質問者

お礼

有難うございます。頑張って勉強します

関連するQ&A