何をバカな質問してるんだと思われるかも知れませんが、最近C++を学び始めたばかりなのでわからないのです。(本・その他いろいろなサイトを見て回りましたがいまだにわかりません。)

1.#include<iostream>と#include<iostream.h>の違い?

私が購入した本では前者の方で記述されていますが、プログラミング関係のサイトでは必ず後者の方の記述がされてますが、果たして違いはあるのでしょうか?

2.例えば
void main(){
char c[11];
cout <<"貴方の名前は?"<<endl;
cin >> c;
cout << c <<"さんですね。"<<endl;
}

の場合、char c は10文字(日本語5文字)までが入るということですよね?
でも実行して、10文字以上記入しても問題無く10文字以上表示されるのですがなぜなのでしょう?(borland5.5コンパイラで)
ちなみにVC++でトライしてみたら、「重要なエラーが発生しました。マイクロソフトに連絡を~」といった
エラーメッセージが表示されます。

こんな初めてつまづくと先が思いやられますが、完全に把握しないと先に進まないといった性格ですので、この2点お分かりの方、宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

1.


C++の(比較的)新しい仕様であるネームスペース(=名前空間)に関連します。
詳しいことをここでダラダラ書くよりも「C++ 名前空間」で検索した方が有益な情報が得られるでしょう。

結論だけ言うと「比較的新しいコンパイラではiostream.hではなくiostreamが推奨される」。

2.
メモリ管理の方式の違いが実行結果に出ているのでしょう。
11バイトの領域に対して11バイト以上のデータを格納した場合の挙動は定義外です。
よって、実行結果は処理系(環境とコンパイラ)に依存します。

やってはいけないことをやった結果ですから、素直にエラーを出すVC++の方が好ましい結果だと言えます。
しかし、処理系依存ですからBC++の結果が“あきらかな間違い”とは言えません。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
また何かありましたら宜しくお願い致します。

お礼日時:2001/12/13 19:13

1.まず#includeとはそこに指定したファイルを埋め込む命令です。


 つまり「"iostream.h"というファイルをそこに埋め込みなさい。」
 と言う意味です。

 なので"iostream"というファイルがあれば間違いではありませんが、
 通常ヘッダーファイルを読み込むのであれば、
 拡張子".h"が付いた"iostream.h"ですね。

2.char c[11];とした場合、
 半角文字11文字が格納されます。
 ⇒文字列の場合NULLを入れるので10文字が望ましいですが…。

 それを超えた場合はコンパイラによってエラーとされるか、
 強制的にメモリのどこかに書き込まれます。
 いわゆるアクセスバイオレーションを引き起こす原因となります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
また何かありましたら宜しくお願い致します。

お礼日時:2001/12/13 19:14

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

このQ&Aと関連する良く見られている質問

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

QC++ : cout << (数字) で実行時エラーが発生する理由

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for...続きを読む

Aベストアンサー

> void rev_str(const char *source, char *des)
> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

QC++のデフォルトinclude文?

こんにちわ。大学でC++を勉強している者です。授業のプロジェクトで自分の作ったC++のプログラムを大学のLinuxサーバでコンパイルしたところ問題なくコンパイルが通り、動作確認も出来たのですが、それを教授に提出したところ、コンパイルが出来ませんと言われました。どうやら教授は若干大学の研究室のコンピュータと違う環境でコンパイルした模様です。教授の部屋に行ってエラーを見たところ、exit, srand, rand等の関数が見つかりませんと言われていました。どれもstdlib.hに属する関数だと思い、#include <stdlib.h>を入れて再提出したところ問題が解決した。が、どうして研究室のマシンではエラーが起きなかったのかが未だにわかりません。g++のコンフィグにデフォルトのinclude文を定義するところがあってそれが違ってたのではないかとか思っているのですが、確かな情報が未だにつかめていません。教授に聞いたのですが、彼はネットワークが専門でC++の専門ではないので「わかりません」とあっさり言われてしまいました。。。環境についてですが、わかっているのは研究室のマシンがCentOS release 5.5だということだけ。教授のマシンは不明です。宜しくお願いします。

こんにちわ。大学でC++を勉強している者です。授業のプロジェクトで自分の作ったC++のプログラムを大学のLinuxサーバでコンパイルしたところ問題なくコンパイルが通り、動作確認も出来たのですが、それを教授に提出したところ、コンパイルが出来ませんと言われました。どうやら教授は若干大学の研究室のコンピュータと違う環境でコンパイルした模様です。教授の部屋に行ってエラーを見たところ、exit, srand, rand等の関数が見つかりませんと言われていました。どれもstdlib.hに属する関数だと思い、#include <std...続きを読む

Aベストアンサー

それらは、GCCのビルトイン関数と呼ばれるものです。
GCCに組込まれているもので、特定のヘッダをincludeしているわけではありません。

無効にする方法、その他、詳しくは
http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Dialect-Options.html#index-fno_002dbuiltin-107
http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Other-Builtins.html#Other-Builtins
あたりを。何がビルトインになっているかは、バージョンによって違いがあります。


> どれもstdlib.hに属する関数だと思い

まともな解説書、マニュアルなら、特定の標準関数を使いたいときに、#includeにどのファイルを指定すればいいか明記されているはずです。


人気Q&Aランキング

おすすめ情報