4

次のg ++​​コンパイラを使用してソースをコンパイルしているときに、このエラーが発生する理由を誰かが説明できますか

#include <cstdio>
#include <string>

using namespace std;

int main()
{
    char source_language[50];


    scanf("%16s\n",source_language);

    int length = sizeof(source_language);
    int sizeofchar = strlen(source_language);
    printf("%d\n",sizeofchar);
}

これにより、次のエラーが発生します

test.cpp: 関数 'int main()' 内:

test.cpp:31: エラー: 'strlen' はこのスコープで宣言されていません

#include <string>#include <string.h> orに変更する#include<cstring>と正常に動作し#include<string>ます#include<string.h>。どんな助けにも本当に感謝します

4

4 に答える 4

13

strlenで宣言されているstring.h(または、の名前空間のメンバーとしてstd)関数を使用しようとしていますcstring。したがって、使用strlenするには、これら2つのヘッダーのいずれかを含める必要があります。

完全に無関係なC++固有のヘッダーファイルであり、C標準ライブラリの文字列関数とはまったく関係がないため、この#include <string>バリアントは機能しません。それがうまくいくと思った理由は何ですか?string

于 2010-02-13T18:41:19.040 に答える
7

C ++プログラマーは通常、少なくとも2種類の文字列を処理する必要があります。生のCスタイルの文字列で、通常はchar *str;またはとして宣言され、などchar str[123];で操作できます。strlen()およびC++スタイルの文字列。これらはタイプを持ち、のstd::stringようなメンバー関数で操作されますstring::length()。残念ながら、これは少し混乱を招きます。

  • Cでは、他を#include <string.h>宣言します。strlen()
  • C ++では、#include <cstring>代わりに、名前空間でそれらを宣言する必要があるstdため、これらの関数をstd::strlen()etcなどとして呼び出すか、フォローアップする必要があります。その場合は、通常どおり、etcなどをusing namespace std;呼び出すことができます。strlen()
  • C ++には、C++タイプを宣言する完全に独立したヘッダーあります。このヘッダーはとは関係がないため、ヘッダーを含めるとアクセスできなくなります。<string>std::stringstrlen()strlen()

MehrdadAfshariが彼の答えを削除した理由はわかりません。これは基本的にここで繰り返します。

于 2010-02-13T18:43:05.467 に答える
4
#include<string>

このインクルードは、c 文字列ではなく、c++ std::string 用です (リンク: http://www.cppreference.com/wiki/string/start )

それらの:

#include<cstring>

#include<string.h>

C文字列用です(リンク:http://www.cplusplus.com/reference/clibrary/cstring/

于 2010-02-13T18:30:48.830 に答える
0

strlen() の代わりに string.length() を使用する

于 2013-04-07T12:03:28.297 に答える