掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24014

文字列を逆順するプログラム
投稿者---kyo(2005/11/08 18:10:44)


文字を読み込んで、逆順に出力するプログラムを作りなさいという問いでここまでやったのですが、わかりません。
どこがまずいのでしょうか?

#include <stdio.h>
#define N 100
int main(void)
{
char s1[N+1],s2[N+1];
int i,j;
printf("100文字以内の文字を入力せよ。 ");
gets(s1);
printf("%s\n",s1);
printf("==> ");
{
for(i=N+1;i>=1;i=i-1)
for(j=0;j<=N+1;j++)
if(s1[i] == '\0')
s2[j]=s1[i-1];
printf("%s",s2);
}
return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列を逆順するプログラム 24015 REE 2005/11/08 18:44:13
<子記事> Re:文字列を逆順するプログラム 24023 RiSK 2005/11/08 22:36:36
<子記事> Re:文字列を逆順するプログラム 24024 かずま 2005/11/08 22:47:58


No.24015

Re:文字列を逆順するプログラム
投稿者---REE(2005/11/08 18:44:13)


>文字を読み込んで、逆順に出力するプログラムを作りなさいという問いでここまでやったのですが、わかりません。
>どこがまずいのでしょうか?

以下の2項目を守っていないところがまずいです。
 ソースの添付は「HTML変換ツール」で字下げします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。

ついでに、ループが2重になっている点もまずいです。




この投稿にコメントする

削除パスワード

No.24023

Re:文字列を逆順するプログラム
投稿者---RiSK(2005/11/08 22:36:36)


>文字を読み込んで、逆順に出力するプログラムを作りなさいという問い
// puts の仕様に準拠した ReversePuts
#include <stdio.h>

static int ReversePutsSub(const char * s)
{
    if (*s) return ReversePutsSub(s+1) == EOF ? EOF : putchar(*s);
    return 0;
}

int ReversePuts(const char * s)
{
    return ReversePutsSub(s) == EOF ? EOF : putchar('\n');
}

int main(void)
{
    const char * s = "0123456789";
    do {
        puts(s);
        ReversePuts(s);
    } while (*s++);
    return 0;
}



この投稿にコメントする

削除パスワード

No.24024

Re:文字列を逆順するプログラム
投稿者---かずま(2005/11/08 22:47:58)


> 文字を読み込んで、逆順に出力するプログラムを作りなさいという問い

次のプログラムは文字列を読み込んでいないし、文字コードが Shift-JIS
という特殊な環境を仮定しているので解答ではありません。
#include <stdio.h>

char *rev(char *s)
{
    int i, j, c;
    for (i = 0; s[i]; i++)
        if ((s[i] & 0xff ^ 0x20) - 0xa1u < 60)
            c = s[i], s[i] = s[i+1], s[++i] = c;
    for (j = 0; j < --i; j++)
        c = s[j], s[j] = s[i], s[i] = c;
    return s;
}

int main(void)
{
    char *s = "abcあいうxyz";
    puts(s);
    puts(rev(s));
    return 0;
}



この投稿にコメントする

削除パスワード

No.24035

Re:文字列を逆順するプログラム
投稿者---かずま(2005/11/09 01:29:50)


>   char *s = "abcあいうxyz";

次のように訂正します。

    static char s[] = "abcあいうxyz";
なぜだか分かりますか?


この投稿にコメントする

削除パスワード

No.24036

Re:文字列を逆順するプログラム
投稿者---kura(2005/11/09 01:42:00)


なぜですか??
int型でとれるから・・・・とかですかね?


この投稿にコメントする

削除パスワード

No.24119

Re:文字列を逆順するプログラム
投稿者---かずま(2005/11/11 20:04:36)


> int型でとれるから・・・・とかですかね?
int型で何がとれるのですか?

さて、char *s = "abcあいうxyz"; ですが、文字列リテラルを
プログラムで書き換えるとどうなるかは規格で未定義になっています。

関数 rev(char *s) は、s の指す文字列を書き換えます。だから、これは
未定義動作で、実際、VC++ や BCC では動いて、gcc では動きません。

char s[] = "abcあいうxyz"; にすると、s の領域が文字列リテラルの値で
初期化されるので、s の領域は書き換え可能です。

さらに static を指定すると、初期化が実行時ではなく、最初から行われて
いるので、無駄なコードと処理時間をなくすことができます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧