• ベストアンサー
※ 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
質問者

お礼

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

すると、全ての回答が全文表示されます。
録画用HDDが未接続状態の対処法
このQ&Aのポイント
  • ひかりTV for NUROのST3400チューナーで録画用HDD(AVHD-UTB3)が未接続状態のままで録画した内容が見られない問題が発生しています。チューナーとネットワークの電源を何度か抜き差ししましたが、HDDはオレンジのランプが点灯しチューナーに認識されません。
  • ひかりTV for NUROのテレビおすすめプランを利用しているユーザーが、録画用HDDが未接続状態のため録画した番組が見れないトラブルに遭遇。この問題を解決するためにチューナーやネットワークの電源を再起動しましたが、HDDは依然としてオレンジランプのまま認識されません。
  • 録画用HDD(AVHD-UTB3)がST3400チューナーに認識されず、録画した内容が見られないという問題が発生。チューナーとネットワークの電源を何度か抜き差ししましたが、HDDのランプはオレンジ色のままです。問題解決についてのアドバイスを求めています。
回答を見る

専門家に質問してみよう