usar - obtener el primer caracter de una cadena c++




¿Cómo declarar una matriz de cadenas en C++? (10)

Estoy intentando iterar sobre todos los elementos de una matriz estática de cadenas de la mejor manera posible. Quiero poder declararlo en una línea y agregar / eliminar elementos fácilmente sin tener que hacer un seguimiento del número. Suena realmente simple, ¿no?

Posibles no soluciones:

vector<string> v;
v.push_back("abc");
b.push_back("xyz");

for(int i = 0; i < v.size(); i++)
    cout << v[i] << endl;

Problemas: no hay forma de crear el vector en una línea con una lista de cadenas

Posible no solución 2:

string list[] = {"abc", "xyz"};

Problemas: no hay forma de obtener el número de cadenas automáticamente (que yo sepa).

Debe haber una manera fácil de hacer esto.


Problemas: no hay forma de obtener el número de cadenas automáticamente (que yo sepa).

Hay una manera estándar de hacer esto, que mucha gente (incluyendo MS) define macros como arraysize para:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

Puedes usar la sugerencia de Will Dean [ #define arraysize(ar) (sizeof(ar) / sizeof(ar[0])) ] para reemplazar el número mágico 3 aquí con arraysize (str_array) - aunque recuerdo que hay algún caso especial en el que esa versión particular de arraysize podría hacer algo malo (lo siento, no puedo recordar los detalles de inmediato). Pero a menudo funciona correctamente.

El caso donde no funciona es cuando la "matriz" es realmente solo un puntero, no una matriz real. Además, debido a la forma en que las matrices se pasan a las funciones (convertidas en un puntero al primer elemento), no funciona en todas las llamadas de función, incluso si la firma se parece a una matriz - some_function(string parameter[]) es realmente some_function(string *parameter) .


C ++ 11 agregó listas de inicialización para permitir la siguiente sintaxis:

std::vector<std::string> v = {"Hello", "World"};

El soporte para esta característica de C ++ 11 se agregó al menos a GCC 4.4 y solo en Visual Studio 2013 .


Declare una matriz de cadenas en C ++ como esta: char array_of_strings[][]

Por ejemplo: char array_of_strings[200][8192];

contendrá 200 cadenas, cada cadena tendrá un tamaño de 8kb u 8192 bytes.

use strcpy(line[i],tempBuffer); para poner datos en la matriz de cadenas.


Intenté revalidar la respuesta de Craig H de que deberías usar boost :: assign, pero no tengo rep :(

Encontré una técnica similar en el primer artículo que leí Andrei Alexandrescu en C / C ++ Users Journal , Vol 16, No 9, septiembre de 1998, págs. 73-74 (tengo toda la cita porque está en los comentarios de mi implementación de su código que he estado usando desde entonces).

Las plantillas son tu amigo



Puede inicializar de forma concisa un vector<string> desde una matriz char* creada estáticamente:

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

Esto copia todas las cadenas, por cierto, por lo que utiliza el doble de memoria. Puedes usar la sugerencia de Will Dean para reemplazar el número mágico 3 aquí con arraysize (str_array), aunque recuerdo que hay un caso especial en el que esa versión particular de arraysize puede hacer algo malo (lo siento, no recuerdo los detalles de inmediato) . Pero a menudo funciona correctamente.

Además, si realmente está entusiasmado con la cuestión de una línea, puede definir una macro variadica para que una sola línea como DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); trabajos.


Puede usar las funciones de begin y end de la biblioteca de rango de Boost para encontrar fácilmente los extremos de una matriz primitiva y, a diferencia de la solución de macro, dará un error de compilación en lugar de un comportamiento defectuoso si lo aplica accidentalmente a un puntero.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}

#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}






arrays