получение длины массива с использованием strlen в g ++ компиляторе - PullRequest
4 голосов
/ 13 февраля 2010

Может кто-нибудь объяснить, почему я получаю эту ошибку при компиляции исходного кода, используя следующий компилятор 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> очень ценю любую помощь

Ответы [ 4 ]

13 голосов
/ 13 февраля 2010

Вы пытаетесь использовать функцию strlen, которая объявлена ​​в string.h (или, как член пространства имен std в cstring). Итак, чтобы использовать strlen, вы должны включить один из этих двух заголовков.

Вариант #include <string> не работает просто потому, что string - это совершенно не связанный с C ++ специфический заголовочный файл, который не имеет абсолютно ничего , связанного со стандартными строковыми функциями библиотеки C. Что заставило вас ожидать, что это будет работать?

7 голосов
/ 13 февраля 2010

C ++ программистам обычно приходится иметь дело как минимум с двумя разновидностями строки: необработанными строками в стиле C, обычно объявленными как char *str; или char str[123];, которыми можно манипулировать с strlen() и т. Д .; и C ++ - строки в стиле, которые имеют тип std::string и обрабатываются функциями-членами, такими как string::length(). К сожалению, это приводит к некоторой путанице.

  • В C #include <string.h> объявляется strlen() и др.
  • В C ++ вместо этого вам нужен #include <cstring>, который объявляет их в пространстве имен std, поэтому вы можете либо вызывать эти функции как std::strlen() и т. Д., Либо вам нужно следовать using namespace std;, в этом случае затем вы можете просто позвонить им как strlen() и т. д. как обычно.
  • C ++ также имеет совершенно отдельный заголовок с именем <string>, который объявляет тип C ++ std::string. Этот заголовок не имеет ничего общего с strlen(), поэтому его включение не позволит вам получить доступ к strlen().

Я не знаю, почему Мехрдад Афшари удалил свой ответ, который я, по сути, повторяю здесь.

4 голосов
/ 13 февраля 2010
#include<string>

это включает c ++ std :: string, а не c string (ссылка: http://www.cppreference.com/wiki/string/start)

и те:

#include<cstring>

и

#include<string.h>

для строк c (ссылка: http://www.cplusplus.com/reference/clibrary/cstring/)

0 голосов
/ 07 апреля 2013

используйте string.length () вместо strlen ()

...