有人可以解释为什么我在使用以下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>
或#include<cstring>
时,它运行正常,我需要弄清楚使用#include<string>
和#include<string.h>
有什么区别。非常感谢任何帮助
答案 0 :(得分:13)
您正在尝试使用strlen
函数,该函数在string.h
中声明(或作为std
中的命名空间cstring
的成员)。因此,为了使用strlen
,您应该包含这两个标题中的一个。
#include <string>
变体不起作用,因为string
是一个完全不相关的C ++特定的头文件,它与C标准库字符串函数绝对没有没有。是什么让你期望它会起作用?
答案 1 :(得分:7)
C ++程序员通常必须处理至少2种字符串:原始C风格的字符串,通常声明为char *str;
或char str[123];
,可以使用strlen()
等进行操作。 ;和C ++风格的字符串,其类型为std::string
,并使用string::length()
等成员函数进行操作。不幸的是,这会导致一些混乱。
#include <string.h>
声明strlen()
等人#include <cstring>
,它在std
命名空间中声明它们,因此您可以将这些函数称为std::strlen()
等,或者您需要跟进{ {1}},在这种情况下,您可以像往常一样将它们称为using namespace std;
等。strlen()
的完全独立的标头,它声明了C ++类型<string>
。此标头与std::string
无关,因此包含该标头不允许您访问strlen()
。我不知道为什么Mehrdad Afshari删除了他的答案,我在这里重复了。
答案 2 :(得分:4)
#include<string>
这包括c ++ std :: string,而不是c string(link:http://www.cppreference.com/wiki/string/start)
和那些:
#include<cstring>
和
#include<string.h>
适用于c字符串(链接:http://www.cplusplus.com/reference/clibrary/cstring/)
答案 3 :(得分:0)
使用string.length()而不是strlen()