文字の並びを反転させるプログラムなんですけど、
実行するとエラーが出てどこが間違っているのかがよくわからなくて。。。
教えてほしいです
#include <stdio.h>
char *cswap(char *str, int i, int j);
char *reverse(char *str);
int main(void)
{
char st1[100];
printf("input 文字列 => "); scanf("%s", st1);
printf("反転前 -> %s\n", st1);
printf("反転後 -> %s\n", reverse(st1));
return 0;
}
char *cswap(char *str, int i, int j)
{
char w;
w = *(str + i);
*(str + i) = *(str + j);
*(str + j) = w;
return str;
}
char *reverse(char *str)
{
int i = 0;
while (*(str + i) != '0')
{
if ('A' <= *(str + i) && (str + i) <= 'Z')*(str + i);
i++;
}
return str;
}
ポインタと文字列
Re: ポインタと文字列
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
具体的にどのようなエラーですか?
不自然なポインタと整数の比較(str + i) <= 'Z'および実質何もしない文*(str + i);があるだけでなく、
whileループ内で実質何もせず、実質入力のポインタをそのまま返す関数になっています。 (次のレスで訂正します)
文字の並びを反転させるには、少なくとも何らかの文字データの書き込みが必要でしょう。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
こちらで実行したところ、文字列の反転はされませんでしたがエラーは出ませんでした。りん さんが書きました:実行するとエラーが出て
具体的にどのようなエラーですか?
reverse関数が間違っていますね。りん さんが書きました:どこが間違っているのかがよくわからなくて。。。
不自然なポインタと整数の比較(str + i) <= 'Z'および実質何もしない文*(str + i);があるだけでなく、
whileループ内で実質何もせず、実質入力のポインタをそのまま返す関数になっています。 (次のレスで訂正します)
文字の並びを反転させるには、少なくとも何らかの文字データの書き込みが必要でしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ポインタと文字列
申し訳ありません。
よく見たら、reverse関数のwhile文は文字0があるまで繰り返すので、
0を含まない文字列を入力すると、文字列の先まで読み込んでしまい、初期化されていない自動変数の値の使用や配列の範囲外の読み込みで未定義動作になってしまいます。
"aiueo"を入力して実行したのに正常終了したのはたまたまですね。
よく見たら、reverse関数のwhile文は文字0があるまで繰り返すので、
0を含まない文字列を入力すると、文字列の先まで読み込んでしまい、初期化されていない自動変数の値の使用や配列の範囲外の読み込みで未定義動作になってしまいます。
"aiueo"を入力して実行したのに正常終了したのはたまたまですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ポインタと文字列
#include <stdio.h>
#include <string.h>
void reverse(char *s)
{
char c;
int i;
for (i = 0; i < strlen(s) / 2; i++) {
c = s[i], s[i] = s[strlen(s)-1-i], s[strlen(s)-1-i] = c;
}
}
int main(void)
{
char s[100];
printf("文字列:"), scanf("%99s", s);
printf("入替え前:%s\n", s);
reverse(s);
printf("入替え後:%s\n", s);
return 0;
}
Re: ポインタと文字列
入力が英語のアルファベットの大文字かを判定しようとしているようなコードがあるのが気になります。りん さんが書きました:文字の並びを反転させるプログラムなんですけど
詳しい仕様を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ポインタと文字列
#include <stdio.h>
char *cswap(char *str, int i, int j);
char *reverse(char *str);
int main(void)
{
char st1[100];
printf("input 文字列 => "); scanf("%s", st1);
printf("反転前 -> %s\n", st1);
printf("反転後 -> %s\n", reverse(st1));
return 0;
}
char *cswap(char *str, int i, int j)
{
return (j = str[i]) ? *(str = cswap(str, i+1, 0)) = j, str+1 : str;
}
char *reverse(char *str)
{
cswap(str, 0, 0);
return str;
}