お世話になります。みなぎと申します。
VC++6.0とWindows2000を使っています。
string型というのがいまいち使い方がわかりません・・・
---------------------------------
#include <iostream>
#include <string.h>
int main()
{
string a;
a = Hello! World!!;
std::cout << a << endl;
return 0;
}
----------------------------------
上記のプログラムをビルドすると、
「'string' : 定義されていない識別子です。」
というエラーが出てしまいます。
参考書を見て書いたのですが、string.hをインクルード
すればできると書いてあったのですが。。。
どなたかお教え願いますm(_ _)m
<string>(string.hじゃないよ)
をインクルードして std::string を使う。
#include <iostream>
#include <string> // <- .h は不要
int main()
{
std::string a; // <- std namespace
a = Hello! World!!;
std::cout << a << std::endl; // <- ついでに endl も std namespace
return 0;
}
> 参考書を見て書いたのですが、string.hをインクルード
> すればできると書いてあったのですが。。。
そんなデタラメぶっこいた参考書があるですか。
書名知りたし。是非。
PAIさん、Banさん、ありがとうございました。
おかげさまで動きました!
stringもendlもstdに所属(?)しているのですね
main関数の前に using namespace std とすることにしました。
ついでにもう2つほど、質問してもよろしいでしょうか?
//一つ目
#include <string> と
#include <string.h> は何が違うのでしょうか?
//二つ目
#include string と
#include <string> は何が違うのでしょうか?
細かい違いが(細かくないのかな?)わかりません・・
googleとかで検索してみたのですが、検索の仕方が下手なのか見つかりません。
お手数おかけしますが、お答えできたらお願い致します。
みなぎ
> #include <string> と
> #include <string.h> は何が違うのでしょうか?
まったく別物です。
> #include string と
> #include <string> は何が違うのでしょうか?
インクルードファイルの検索順序が違います。
# 再度。
# そんなデタラメぶっこいた参考書があるですか。
# 書名知りたし。是非。
> #include <string> と
> #include <string.h> は何が違うのでしょうか?
前者は,C++言語の標準ライブラリに含まれるstringクラスを用いる際に必要なヘッダフ
ァイルの挿入,
後者は,C言語の標準ライブラリに含まれる文字列処理関係の関数(strlen, strcpy,
strcat...その他多数)を用いる際に必要なヘッダファイルの挿入,
をコンパイラに指示します.
なお,C++で文字列処理関数を使う場合,現在は後者でも許されるコンパイラが多いです
が,正しくは
#include <cstring>
です.
> 現在は後者でも許されるコンパイラが多いですが
ほんまですか? たとえば?
ってゆーか、許すも許さんもないと思う。
> 正しくは #include <cstring> です.
これは'その通り'なんだけど。
>> 現在は後者でも許されるコンパイラが多いですが
> ほんまですか? たとえば?
C++で文字列処理の関数を使うには,<string.h>でなく,<cstring>をインクルードする
のが正しいということを強調するつもりでしたが,妙な誤解を与える記述でしたね.
申し訳ありませんでした.
次のようなコードのコンパイルが通るということを想定したものでした.
#include <string.h> // <cstring>でない
#include <iostream>
int main()
{
char str[] = sample;
std::cout << strlen( str ) << std::endl;
}
ああ,なんかさらに誤解を生みそうなので,元文を書き替えておきます^^;
「「
なお,C++で文字列処理関数を使う場合,正しくは
#include <cstring>
です.
C++の標準化前のコードの互換性を保つため,今のところ
#include <string.h>
によっても文字列処理関数が使えますが,これは,C++の標準化にあたって,いわゆる
「不賛成を唱えられた」仕様で,将来ともこれで良いことが保証されているものではあ
りません.
」」
# まだ不正確なところがありましたらツッコミをどうぞ^^
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
string a;
a = Hello! World!!;
// cout << a << endl;
return 0;
}
コンパイルは通った・・・コメント外すと通らないけど(^^;
# 環境 VS2003.NETPro PSDK WTL71 Boost
# 通らないで欲しかった・・・
# ちなみに、string.h はインクルードしなくても同じです。
# iostream の奥の方でインクルードされるんですけどね
コメント外すと以下のエラーです。
> error C2679: 二項演算子 '<<' : 型 'std::string' の右オペランドを扱う演算子が見つ
かりません (または変換できません)。
# 中途半端な・・・
> コメント外すと以下のエラーです。
> error C2679: 二項演算子 '<<' : 型 'std::string' の右オペランドを扱う演算子が見つ
かりません (または変換できません)。
私も前の投稿を投げる前に確認したときに、同じものが出ました....。
そもそも、VC6だと <cstdlib> とか書いても実は
軒並みグローバルになってたりしませんか。
> そもそも、VC6だと <cstdlib> とか書いても実は
> 軒並みグローバルになってたりしませんか。
んな感じですねぇ~
今回の string にしたって、<iostream> の奥底で定義されてますし・・・
# 私は件のようなコードで書くことはないですが・・・
# コンパイルが通るから間違いじゃないって保障ないのにねぇ~・・・
# 通る記述が悪いのか、使い方を知らない人が悪いのか・・・
# 個人的には後者だと思うけど、知らないと資料信じちゃうよねぇ~・・・
「グローバルも通ってしまう」というのも痛いですが、
逆に「std:: をつけると通らない」と言うのももっとアレかと。
言語仕様通りに書いても通らないので、その資料の方を疑い、
実際に動く MS のコンパイラで通る方が正しいと思ってしまう...
というのも、(特にWindows 専門の人には)ありがちな罠だと思います。
namespace std { using ::memset; }
昔はこんなようなことを自前のラッパでやってた気がしますが、
他に回避策ってあったのでしょうか>VC6
# 考えてみればもう 10年近く昔のコンパイラですし、
# 仕様が古いのは今となっては当然だと思いますが、
# 未だに現役なのは不幸だと思います。
# やっぱり、次のバージョンが .NET 対応ばかり強調されたことや、
# IDE が刷新されたことが原因の一端にあるのでしょうか。