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>and有什么区别#include<string.h>。非常感谢任何帮助

4

4 回答 4

13

您正在尝试使用在(或作为名称空间的成员)strlen中声明的函数。因此,为了使用,您应该包含这两个标题之一。string.hstdcstringstrlen

#include <string>变体之所以不起作用,仅仅是因为string它是一个完全不相关的 C++ 特定头文件,它与 C 标准库字符串函数完全无关。是什么让您期望它会起作用?

于 2010-02-13T18:41:19.040 回答
7

C++ 程序员通常必须处理至少两种类型的字符串:原始 C 风格的字符串,通常声明为char *str;or char str[123];,可以使用strlen()等进行操作;和 C++ 风格的字符串,它们具有类型std::string并使用string::length(). 不幸的是,这会导致一些混乱。

  • 在 C 中,#include <string.h>声明strlen()等。
  • 在 C++ 中,您需要#include <cstring>在命名空间中声明它们std,因此您可以将这些函数称为std::strlen()etc.,或者您需要跟进using namespace std;,在这种情况下,您可以strlen()像往常一样调用它们 as etc.。
  • C++还有一个名为 的完全独立的头文件<string>,它声明了 C++ 类型std::string。此标头与此无关strlen(),因此包含它不会让您访问strlen()

我不知道为什么 Mehrdad Afshari 删除了他的答案,我基本上在这里重复。

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

这包括用于 c++ std::string,而不是 c 字符串(链接: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

使用 string.length() 而不是 strlen()

于 2013-04-07T12:03:28.297 回答