みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の、ポインターの問題を教えて下さい

C言語の、ポインターを使って大文字と小文字を入れ替えるプログラムを教えて下さい。
作ったのですが、うまくいかず困っています。
分かる方、訂正してください。
よろしくお願いいたします。

#include<stdio.h>
void reverse(char *str)
{
int i;
for(i=0;str[i]!='\0';i++)
{
if(str[i]>=0x61)
{str[i]-0x20;}
if(0x40<str[i]<0x5B)
{str[i]+0x20;}
}
return(str);
}

int main(void)
{
int num;
char *str="AddsssEEEEwwwJojoHoih";
printf("Before reverse %s \n",str)
str=reverse(str);
printf("After reverse %s \n",str);
return 0;
}

投稿日時 - 2015-10-21 02:14:11

QNo.9067284

すぐに回答ほしいです

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

色々問題のあるコードですが、最初はそんなものです。
お互いに頑張っていきましょう^^
で、こんな感じでどうですか?

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

投稿日時 - 2015-10-21 07:15:36

お礼

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

投稿日時 - 2015-11-10 18:25:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

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

投稿日時 - 2015-10-21 12:46:20

お礼

ありがとうございます。

投稿日時 - 2015-11-10 18:27:05

ANo.3

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

投稿日時 - 2015-10-21 07:39:34

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

投稿日時 - 2015-10-21 04:15:34

お礼

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

投稿日時 - 2015-11-10 18:25:25

あなたにオススメの質問