Лучший способ создать строку C - PullRequest
7 голосов
/ 14 июня 2010

Я сейчас использую

char *thisvar = "stringcontenthere";

для объявления строки в C.

Это лучший способ объявить строку в C?

А как насчет генерации C-строки из C ++ - Strings?

Ответы [ 5 ]

13 голосов
/ 14 июня 2010

В C это зависит от того, как вы будете использовать строку:

  • именованная константа: ваш char* str = "string"; метод в порядке (но должен быть char const*)
  • dataдля передачи в подфункцию, но не будет использоваться после того, как вызывающая функция вернет:
    char str[] = "string";
  • данные, которые будут использованы после выхода из функции, объявленной в функции: char* str = strdup("string");, и убедитесь, чтов конечном итоге он получает free d.

, если это не распространяется, попробуйте добавить более подробную информацию в ваш ответ.

1 голос
/ 30 сентября 2013

Это зависит. Строки в кодировке ASCII см. В параграфах C и C ++. Для строк в кодировке Юникод см. Последний абзац.

C

Как отметил Дэвид, это зависит от того, как использовать строку в C:

  • как константа, то: const char s[] = "Hello World";
  • в виде строки, содержащей переменные данные: char s[] = "Hello World";
  • как массив данных char *data; Инициализация затем должна быть настроена.

Обратите внимание, что в C есть все строки с нулевым символом в конце, что означает определение, например, char s[] = "foo"; неявно включает в себя символ NULL в конце s[3]='\0'.

Также обратите внимание на тонкую разницу между char *s и char s[], которая часто может вести себя одинаково, но иногда нет! (см. Является ли имя массива указателем? ), например:

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char* argv[])
{
  char s[] = "123456789123456789123456789";
  char *t = (char*) malloc( sizeof(char) * 28 );
  for( size_t i = 0; i < 28; ++i )
      t[ i ] = 'j';
  printf( "%lu\n", sizeof(s) );
  printf( "%lu\n", sizeof(t) );
  printf( "%s\n", s );
  printf( "%s\n", t );
  return EXIT_SUCCESS;
}

Поэтому я рекомендую использовать массивы символов всякий раз, когда вы используете их в качестве строк и указателей символов, когда вы используете их в качестве массива данных.

C ++:

В C ++ есть собственный строковый тип данных: std::string. Если вам просто нужна C-String версия std :: string (например, с использованием некоторого C-API), просто используйте член c_str():

std::string s = "Hello World";
your_c_call( s.c_str(), ... );

Unicode:

Если вы хотите иметь строки в юникоде, тогда вам действительно нужно что-то вроде

char utf8String[] = u8"Hello World";

и старайтесь не использовать wchar_t, когда это возможно. См. Эту превосходную статью по этому вопросу: http://www.nubaria.com/en/blog/?p=289. Пожалуйста, обратите внимание, что есть также поддержка Unicode для C ++. Но в целом я испытываю соблазн сказать, что вы должны идти с обычными персонажами настолько далеко, насколько можете. Интересный ресурс по этому поводу: http://www.cprogramming.com/tutorial/unicode.html

1 голос
/ 14 июня 2010
const char *thisvar="stringcontenthere";
1 голос
/ 14 июня 2010

Как и другие, и я хочу, чтобы вы "сделали это" способом C++, используйте std::string.

Если вам как-то нужен C-string, std::string имеет метод, который дает const char*.

Вот пример:

#include <iostream>
#include <string>

void dummyFunction(const char* str)
{
  // Do something
}

int main(int, char**)
{
  std::string str = "hello world!";

  dummyFunction(str.c_str());

  return EXIT_SUCCESS;
}
0 голосов
/ 14 июня 2010

Это C или C ++? В C ++ вы должны использовать std::string:

std::string aString("stringcontenthere");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...