ショッピングモール  レギュラー(その他)  インスタント  コーヒー(ソフトドリンク)  ココア


掲示板利用宣言

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

 私は

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

掲示板1

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

No.5277

倍角の連結について
投稿者---あきき(2006/01/17 10:42:49)


ドリル&ゼミナールのQ061の応用として、漢字だけの入力を試みてみましたが、予期しない結果ばかりです。真下のがそのソースです。
どう修正すればよいか、ご教授願います。なおオリジナルソースを添付します

#include <stdio.h>

int main( void )
{
    char str[1024], buf[256];
    char sav_buf[2];
    int  i, j;

    puts("倍角文字列を入力しなさい。終了条件:CTRL+Z");

    i=0;
    while(gets(buf) != NULL){
        j=0;
        while(buf[j] != '\0' && i < 1023){
            sav_buf[0] = buf[j*2];
            sav_buf[1] = buf[j*2+1];
            str[i] = *sav_buf;
            i++;
            j++;
        }
        if(i >= 1023){
            break;
        }
        puts("倍角文字列を入力しなさい。終了条件:CTRL+Z");
    }
    str[i] = '\0';

    printf("%s\n",str);

    return 0;
}


オリジナルソース(半角連結)

#include <stdio.h>

int main( void )
{
    char str[1024], buf[256];
    int  i, j;

    puts("文字列を入力しなさい。終了条件:CTRL+Z");

    i=0;
    while(gets(buf) != NULL){
        j=0;
        while(buf[j] != '\0' && i < 1023){
            str[i] = buf[j];
            i++;
            j++;
        }
        if(i >= 1023){
            break;
        }
        puts("文字列を入力しなさい。終了条件:CTRL+Z");
    }
    str[i]='\0';

    puts(str);

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:倍角の連結について 5278 RAPT 2006/01/17 10:59:35


No.5278

Re:倍角の連結について
投稿者---RAPT(2006/01/17 10:59:35)


突込みどころが満載なのですが、とりあえず、ピンポイントに。
> str[i] = *sav_buf;
これって、
  str[i] = sav_buf[0];
と同じってこと、分かっていますか?

すなわち、あなたのソースは、
buf = "0123456789";
とあったとすると、
str の中身は、"02468" となります。

次に、buf[j+1] == '\0' の場合についてですが、
j>0のとき、j*2 >= j+1 となるため、buf[j*2], buf[j*2+1]
への参照は、範囲外となります。

# 「倍角文字」って言葉の意味は? いわゆる「全角」のこと?
# この場合でも、オリジナルソースのままで動作するはずですが。




この投稿にコメントする

削除パスワード

No.5279

Re:倍角の連結について
投稿者---あきき(2006/01/17 12:01:09)


> str[i] = *sav_buf;
>これって、
> str[i] = sav_buf[0];
>と同じ

配列をポインタで表すとそうなる事を忘れていました。ご指摘ありがとうございます。

>次に、buf[j+1] == '\0' の場合についてですが、
>j>0のとき、j*2 >= j+1 となるため、buf[j*2], buf[j*2+1]
>への参照は、範囲外となります。

とんでもない添字の計算でした。
内ループを以下の通りに修正したら、すんなり正常終了しました。
            str[i] = buf[j];
            str[i+1] = buf[j+1];
            i++;
            j++;


># 「倍角文字」って言葉の意味は? いわゆる「全角」のこと?
># この場合でも、オリジナルソースのままで動作するはずですが。

RAPTさんの指摘された2点で無事解決に至りました。ありがとうございました。

#はい、その通りです。つい、全角の事を、倍角と言う癖がありまして・・
#オリジナルソースでの確認をとらないまま、投稿して管理人さんに大変失礼な事をしました。申し訳ありませんでした。



この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity