No.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型であることに起因したエラーです。
有難う御座います。
私の勘違いでした。うっかりして①の積りで②をやっていました。№5
の補足コメントのソースは後一歩だったんですね。パニックになってい
て分かりませんでした。
全てを理解しました。C言語を触るのは、普段はperlを使っていますが
どうしても遅いのでやむなく使う羽目になりました。もうかなりの前に
使ったきりなので限りなく忘れていました。
今、少し思い出した所です。有難う御座いました。
No.5
- 回答日時:
以下のようにしてください。
------------------------------------
#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;
}
---------------------------------
不明点は補足ください。
有難う御座います。
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';
済みません。お知えて下さい。
No.4
- 回答日時:
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 にするのがよいでしょう
有難う御座います。
と言う事は、常にmallocなどで領域を確保してからでないと
安心して使うと言う事は出来ないと言う事でしょうか。
私の普段使っている言語はperlなので面食らいます。
No.2
- 回答日時:
>char *out="def";
領域を確保しなきゃいけないというのは伝わったみたい
だけど、対処が斜めですね。
文字列リテラルで確保された文字配列は、書き込み可能
だとは限らない。
別途文字配列を用意するか、mallocで領域を確保する。
out = (char*)malloc(4);
確保した領域をを捨てるのを忘れずに。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
小数点入りの文字列をfloat型に...
-
SubStringの使い方について
-
szとlpszの違い
-
char型にint型の数値を代入する。
-
new charとnew char[N]の違いは?
-
文字列配列を動的に割り当てる...
-
strcat関数を自作したいです
-
SetWindowTextについて。
-
警告 : 問題のあるポインタの変換
-
c言語でポインタ変数を用いた配...
-
fgetc( )の戻り値はなぜ整数??
-
共用体について
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
メモリを0クリアする方法について
-
文字列の演算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報
#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
回答者は一発で理解が出来る様な回答をしないといけません。
それが出来ないと言う事は、回答者自身も理解をしていないの
と同じです。
下記の様にしても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;
}
何となく、配列とポインターは違うんだなあと今は思います。
頑張って勉強して見ます。