アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記は、文字化けします。
多分にポインターの定義で不味いのかなと思いますが。
指摘を願います。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="abc";
char *out;
while(*out++ = *in++);
printf("%s\n",out);
return 1;
}

質問者からの補足コメント

  • うーん・・・

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main() {
    char *in="abc";
    char *out="def";
    while(*out++ = *in++);
    printf("%s\n",out);
    return 1;
    }
    下記の様にしてもNG

    回答者は一発で理解が出来る様な回答をしないといけません。
    それが出来ないと言う事は、回答者自身も理解をしていないの
    と同じです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/02/25 11:59
  • うーん・・・

    下記の様にしてもNG
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main() {
    char *in="abc";
    char d[12];
    char *out;
    out=d;
    while(*out++ = *in++);
    printf("%s\n",out);
    return 1;
    }

      補足日時:2017/02/25 12:09
  • うーん・・・

    何となく、配列とポインターは違うんだなあと今は思います。
    頑張って勉強して見ます。

    No.5の回答に寄せられた補足コメントです。 補足日時:2017/02/25 14:25

A 回答 (6件)

No5です。


>char *out=outbufの所を、out=outbuf
>にすると言うのは、具体的にどこが
>どう違うのでしょうか。

これは、
char *out = outbuf;・・・・①

char out = outbuf;・・・・②
としたと理解しました。
①は、 char *out なので、outはchar へのポインターです。
②は、char out なので、outはchar型の1バイトのデータです。

①は
char *data;
data = outbuf;
とおなじです。

②は
char data;
data = outbuf;・・・③
ここで、③はchar型のデータにポインター型のデータを格納しようとしているのでエラーになります。

ほかのエラーも同様にdataがchar型であることに起因したエラーです。
    • good
    • 0
この回答へのお礼

有難う御座います。

私の勘違いでした。うっかりして①の積りで②をやっていました。№5
の補足コメントのソースは後一歩だったんですね。パニックになってい
て分かりませんでした。

全てを理解しました。C言語を触るのは、普段はperlを使っていますが
どうしても遅いのでやむなく使う羽目になりました。もうかなりの前に
使ったきりなので限りなく忘れていました。

今、少し思い出した所です。有難う御座いました。

お礼日時:2017/02/25 19:07

以下のようにしてください。


------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="abc";
char outbuf[256];
char *out = outbuf;
while(*out++ = *in++);
*out = '\0';
printf("%s\n",outbuf);
return 1;
}
---------------------------------
不明点は補足ください。
この回答への補足あり
    • good
    • 0
この回答へのお礼

有難う御座います。

char *out=outbufの所を、out=outbuf
にすると言うのは、具体的にどこが
どう違うのでしょうか。

多分、私はそこを理解をしていないと
思います。

コンパイルでエラーになります。
03.c: In function 'main':
03.c:8:12: warning: initialization makes integer from pointer without a cast [enabled by default]
char out = outbuf;
^
03.c:9:7: error: invalid type argument of unary '*' (have 'int')
while(*out++ = *in++);
^
03.c:10:1: error: invalid type argument of unary '*' (have 'int')
*out = '\0';

済みません。お知えて下さい。

お礼日時:2017/02/25 14:03

C言語は、他の言語以上に「書いてあることしかしない」言語です。


他の言語での「デフォルトでの動作」というものを期待すると、期待通りには動きません。


> char *out;

char型へのポインタ out は用意されました。
しかし、それがどんな領域を示すか。明記していないので、どの領域を指しているか不明です。
NULLですらありません(正確には、NULLかもしれないし、そうでないかもしれない)
そんな領域に書き込もうとすれば、何が起こるかわかりません。
※ 回答者が無知だから「わからない」のではありません。
 C言語の仕様として「こんなときどうなるかを定めない(必ずエラーになる、ということさえも)」となっているのです。

> char *out="def";

char型へのポインタ out は用意されました。
初期値として、 "def" の領域が入っています。

ただ、こういう文字列定数の領域は、自由に書き込める領域では無いのが普通です。
(プログラム中の「読み込み専用領域」に埋め込んでしまう、等)
書き込もうとしたときにどうなるかは、決まっていません。
たまたま書けることもあるし、書いたつもりなのに書き変わってないということも考えられるし、エラーで落ちることもあります。

>char d[12];
>char *out;
>out=d;

char型の配列 d は用意されました。char12個分の領域が自由に使えます。
char型へのポインタ out は用意されました。
outを配列dを示すようにしました。

これで、ひとまず期待通りの動作はします。
ただ、inが長いときはd[12]の範囲を飛び越します。
そのときどうなるかはわかりません。


> printf("%s\n",out);

この時点で、outがどこを指しているか、よく考えてみましょう。
3つ目のプログラムが期待通りにならないのは、これが原因です。

> return 1;

通常、main関数は
0 : 正常終了
0以外 : 異常終了
として処理します。
バッチファイルやシェルスクリプトで、「コマンドが成功/失敗したら〜」という判断には、このmainからの戻り値が0かそうでないかで判断します。
特に理由が無ければ、 0 にするのがよいでしょう
    • good
    • 0
この回答へのお礼

有難う御座います。

と言う事は、常にmallocなどで領域を確保してからでないと
安心して使うと言う事は出来ないと言う事でしょうか。

私の普段使っている言語はperlなので面食らいます。

お礼日時:2017/02/25 13:20

>while(*out++ = *in++);


>printf("%s\n",out);

ループを抜けた後、outがどこを指しているか考えましょう。
    • good
    • 0

>char *out="def";



領域を確保しなきゃいけないというのは伝わったみたい
だけど、対処が斜めですね。

文字列リテラルで確保された文字配列は、書き込み可能
だとは限らない。

別途文字配列を用意するか、mallocで領域を確保する。

out = (char*)malloc(4);

確保した領域をを捨てるのを忘れずに。
    • good
    • 1

これでは動くはずないですよ。


"abc"がいったいどこにコピーされるのか
よく考えましょう。
Cでは自動的にコピー先を用意したりしません。
この回答への補足あり
    • good
    • 0
この回答へのお礼

分かりません。

お礼日時:2017/02/25 11:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!