ポインタと文字列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りん

ポインタと文字列

#1

投稿記事 by りん » 2年前

文字の並びを反転させるプログラムなんですけど、
実行するとエラーが出てどこが間違っているのかがよくわからなくて。。。
教えてほしいです


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

アバター
みけCAT
記事: 6149
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: ポインタと文字列

#2

投稿記事 by みけCAT » 2年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
りん さんが書きました:実行するとエラーが出て
こちらで実行したところ、文字列の反転はされませんでしたがエラーは出ませんでした。
具体的にどのようなエラーですか?
りん さんが書きました:どこが間違っているのかがよくわからなくて。。。
reverse関数が間違っていますね。
不自然なポインタと整数の比較(str + i) <= 'Z'および実質何もしない文*(str + i);があるだけでなく、
whileループ内で実質何もせず、実質入力のポインタをそのまま返す関数になっています。 (次のレスで訂正します)
文字の並びを反転させるには、少なくとも何らかの文字データの書き込みが必要でしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6149
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: ポインタと文字列

#3

投稿記事 by みけCAT » 2年前

申し訳ありません。
よく見たら、reverse関数のwhile文は文字0があるまで繰り返すので、
0を含まない文字列を入力すると、文字列の先まで読み込んでしまい、初期化されていない自動変数の値の使用や配列の範囲外の読み込みで未定義動作になってしまいます。
"aiueo"を入力して実行したのに正常終了したのはたまたまですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

超初級者
記事: 53
登録日時: 4年前

Re: ポインタと文字列

#4

投稿記事 by 超初級者 » 2年前

コード:

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

アバター
みけCAT
記事: 6149
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: ポインタと文字列

#5

投稿記事 by みけCAT » 2年前

りん さんが書きました:文字の並びを反転させるプログラムなんですけど
入力が英語のアルファベットの大文字かを判定しようとしているようなコードがあるのが気になります。
詳しい仕様を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: ポインタと文字列

#6

投稿記事 by かずま » 2年前

コード:

#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;
}
冗談です。すみません。

返信

“C言語何でも質問掲示板” へ戻る