usar una resueltos primer obtener guardar funciones espacios ejercicios ejemplos con como caracteres caracter cadenas cadena arreglo c++ arrays

resueltos - ¿Cómo declarar una matriz de cadenas en C++?



funciones de cadenas de caracteres en c++ (15)

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) .


Aquí hay un ejemplo:

#include <iostream> #include <string> #include <vector> #include <iterator> int main() { const char* const list[] = {"zip", "zam", "bam"}; const size_t len = sizeof(list) / sizeof(list[0]); for (size_t i = 0; i < len; ++i) std::cout << list[i] << "/n"; const std::vector<string> v(list, list + len); std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "/n")); }


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.


En lugar de esa macro, ¿podría sugerir esto?

template<typename T, int N> inline size_t array_size(T(&)[N]) { return N; } #define ARRAY_SIZE(X) (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) Queremos utilizar una macro para que sea una constante en tiempo de compilación; el resultado de la llamada a la función no es una constante en tiempo de compilación.

2) Sin embargo, no queremos usar una macro porque la macro podría ser utilizada accidentalmente en un puntero. La función solo se puede usar en matrices en tiempo de compilación.

Entonces, usamos la definición de la función para hacer que la macro sea "segura"; si la función existe (es decir, tiene un tamaño distinto de cero), entonces usamos la macro como se indica arriba. Si la función no existe, devolvemos un valor incorrecto.


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 declarar directamente una matriz de cadenas como string s[100]; . Luego, si desea acceder a elementos específicos, puede obtenerlo directamente como s[2][90] . Para propósitos de iteración, tome el tamaño de la cadena usando la función s[i].size() .


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));


Una posibilidad es usar un puntero NULL como valor de indicador:

const char *list[] = {"dog", "cat", NULL}; for (char **iList = list; *iList != NULL; ++iList) { cout << *iList; }


#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" ) ); }


#include <iostream.h> #include <iomanip.h> int main() { int n; cout<<"enter the maximum number/n"; cin>>n; cout<<"enter the first number/n"; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; } } cout<<"enter the second number/n"; for(int i=0;i<n;i++) { for(int k=0;k<n;k++) { cin>>b[i][k]; } } cout<<"the product will be/n"; for(int i=0;i<n;i++) { for(int g=0;g<n;g++) { c[i][g]=c[i][c]*c[i][j]; cout<<setw(5)<<c[i][g]; } cout<<endl; } return 0; }