string型の使用ができません – プログラミング – Home

string型の使用ができません
 
通知
すべてクリア

string型の使用ができません

固定ページ 1 / 2

みなぎ
 みなぎ
(@みなぎ)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

お世話になります。みなぎと申します。

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


引用解決済
トピックタグ
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

<string>(string.hじゃないよ)
をインクルードして std::string を使う。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

#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;
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 参考書を見て書いたのですが、string.hをインクルード
> すればできると書いてあったのですが。。。

そんなデタラメぶっこいた参考書があるですか。
書名知りたし。是非。


返信引用
みなぎ
 みなぎ
(@みなぎ)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

PAIさん、Banさん、ありがとうございました。
おかげさまで動きました!
stringもendlもstdに所属(?)しているのですね
main関数の前に using namespace std とすることにしました。

ついでにもう2つほど、質問してもよろしいでしょうか?

//一つ目
#include <string> と
#include <string.h> は何が違うのでしょうか?
//二つ目
#include string と
#include <string> は何が違うのでしょうか?

細かい違いが(細かくないのかな?)わかりません・・
googleとかで検索してみたのですが、検索の仕方が下手なのか見つかりません。

お手数おかけしますが、お答えできたらお願い致します。

みなぎ


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> #include <string> と
> #include <string.h> は何が違うのでしょうか?

まったく別物です。

> #include string と
> #include <string> は何が違うのでしょうか?

インクルードファイルの検索順序が違います。

# 再度。
# そんなデタラメぶっこいた参考書があるですか。
# 書名知りたし。是非。


返信引用
monkey
 monkey
(@monkey)
ゲスト
結合: 21年前
投稿: 70
 

> #include <string> と
> #include <string.h> は何が違うのでしょうか?

前者は,C++言語の標準ライブラリに含まれるstringクラスを用いる際に必要なヘッダフ
ァイルの挿入,
後者は,C言語の標準ライブラリに含まれる文字列処理関係の関数(strlen, strcpy,
strcat...その他多数)を用いる際に必要なヘッダファイルの挿入,
をコンパイラに指示します.

なお,C++で文字列処理関数を使う場合,現在は後者でも許されるコンパイラが多いです
が,正しくは

#include <cstring>

です.


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 現在は後者でも許されるコンパイラが多いですが

ほんまですか? たとえば?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

ってゆーか、許すも許さんもないと思う。

> 正しくは #include <cstring> です.

これは'その通り'なんだけど。


返信引用
monkey
 monkey
(@monkey)
ゲスト
結合: 21年前
投稿: 70
 

>> 現在は後者でも許されるコンパイラが多いですが
> ほんまですか? たとえば?

C++で文字列処理の関数を使うには,<string.h>でなく,<cstring>をインクルードする
のが正しいということを強調するつもりでしたが,妙な誤解を与える記述でしたね.
申し訳ありませんでした.

次のようなコードのコンパイルが通るということを想定したものでした.

#include <string.h> // <cstring>でない
#include <iostream>
int main()
{
char str[] = sample;
std::cout << strlen( str ) << std::endl;
}


返信引用
monkey
 monkey
(@monkey)
ゲスト
結合: 21年前
投稿: 70
 

ああ,なんかさらに誤解を生みそうなので,元文を書き替えておきます^^;

「「
なお,C++で文字列処理関数を使う場合,正しくは

#include <cstring>

です.

C++の標準化前のコードの互換性を保つため,今のところ

#include <string.h>

によっても文字列処理関数が使えますが,これは,C++の標準化にあたって,いわゆる
「不賛成を唱えられた」仕様で,将来ともこれで良いことが保証されているものではあ
りません.
」」

# まだ不正確なところがありましたらツッコミをどうぞ^^


返信引用
あいる
 あいる
(@あいる)
ゲスト
結合: 20年前
投稿: 55
 

#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' の右オペランドを扱う演算子が見つ
かりません (または変換できません)。
# 中途半端な・・・


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> コメント外すと以下のエラーです。
> error C2679: 二項演算子 '<<' : 型 'std::string' の右オペランドを扱う演算子が見つ
かりません (または変換できません)。

私も前の投稿を投げる前に確認したときに、同じものが出ました....。

そもそも、VC6だと <cstdlib> とか書いても実は
軒並みグローバルになってたりしませんか。


返信引用
あいる
 あいる
(@あいる)
ゲスト
結合: 20年前
投稿: 55
 

> そもそも、VC6だと <cstdlib> とか書いても実は
> 軒並みグローバルになってたりしませんか。

んな感じですねぇ~
今回の string にしたって、<iostream> の奥底で定義されてますし・・・

# 私は件のようなコードで書くことはないですが・・・
# コンパイルが通るから間違いじゃないって保障ないのにねぇ~・・・
# 通る記述が悪いのか、使い方を知らない人が悪いのか・・・
# 個人的には後者だと思うけど、知らないと資料信じちゃうよねぇ~・・・


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

「グローバルも通ってしまう」というのも痛いですが、
逆に「std:: をつけると通らない」と言うのももっとアレかと。

言語仕様通りに書いても通らないので、その資料の方を疑い、
実際に動く MS のコンパイラで通る方が正しいと思ってしまう...
というのも、(特にWindows 専門の人には)ありがちな罠だと思います。

namespace std { using ::memset; }
昔はこんなようなことを自前のラッパでやってた気がしますが、
他に回避策ってあったのでしょうか>VC6

# 考えてみればもう 10年近く昔のコンパイラですし、
# 仕様が古いのは今となっては当然だと思いますが、
# 未だに現役なのは不幸だと思います。
# やっぱり、次のバージョンが .NET 対応ばかり強調されたことや、
# IDE が刷新されたことが原因の一端にあるのでしょうか。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました