Cómo inicializar una matriz de caracteres desde una cadena

Quiero hacer lo siguiente

char a[] = { 'A', 'B', 'C', 'D'}; 

Pero no quiero escribir estos caracteres por separado. Quiero algo como

 #define S "ABCD" char a[] = { S[0], S[1], S[2], S[3] }; 

Pero esto no se comstackrá (gcc dice ‘el elemento inicializador no es constante’).

Traté de reemplazar la línea #define con

 const char S[] = "ABCD"; 

Pero eso no parece ayudar.

¿Cómo puedo hacer esto (o algo similar) que me permita escribir el “ABCD” como una ‘cadena’ normal, y no como cuatro caracteres separados?

PD: Parece que la gente no lee la pregunta correctamente …

No puedo obtener el siguiente código para comstackr:

 const char S[] = "ABCD"; char t[] = { S[0], S[1], S[2], S[3] }; char u[] = { S[3], S[2], S[1], S[0] }; 

No se puede, en C. En C, la inicialización de variables estáticas globales y locales está diseñada de tal manera que el comstackdor puede colocar los valores de forma estática en el ejecutable. No puede manejar expresiones no constantes como inicializadores. Y solo en C99, puede usar expresiones no constantes en inicializadores agregados, ¡no así en C89!

En su caso, dado que su matriz es una matriz que contiene caracteres, cada elemento debe ser una expresión constante aritmética. Mira lo que dice sobre esos

Una expresión constante aritmética tendrá un tipo aritmético y solo tendrá operandos que sean constantes enteras, constantes flotantes, constantes de enumeración, constantes de caracteres y expresiones de tamaño.

Seguramente esto no lo satisface su inicializador, que usa un operando de tipo puntero. Seguramente, la otra forma es inicializar su matriz usando un literal de cadena, como lo explica también

Todas las expresiones en un inicializador para un objeto que tenga una duración de almacenamiento estática serán expresiones constantes o literales de cadena.

Todas las citas se sacan del borrador del comité C99 TC3. Entonces, para concluir, lo que quiere hacer (usar expresiones no constantes) no se puede hacer con C. Tiene varias opciones:

  • Escribe tus cosas varias veces, una vez invertida y la otra vez no invertida.
  • Cambia el lenguaje – C ++ puede hacer eso todo.
  • Si realmente quieres hacer eso, usa una matriz de char const*

Esto es lo que quiero decir con la última opción.

 char const c[] = "ABCD"; char const *f[] = { &c[0], &c[1], &c[2], &c[3] }; char const *g[] = { &c[3], &c[2], &c[1], &c[0] }; 

Eso funciona bien, ya que se utiliza una expresión constante de dirección para inicializar los punteros

Una constante de dirección es un puntero nulo, un puntero a un valor de l que designa un objeto de duración de almacenamiento estático, o un puntero a un designador de función; se creará explícitamente utilizando el operador unario & o una constante de entero para convertir en tipo puntero, o implícitamente mediante el uso de una expresión de tipo matriz o función. La matriz-subíndice [] y el acceso de miembros. y -> los operadores, la dirección y la dirección * y los operadores unarios y los cambios de puntero se pueden usar en la creación de una constante de dirección, pero no se puede acceder al valor de un objeto mediante el uso de estos operadores.

Es posible que tengas suerte al ajustar las opciones de tu comstackdor – otra cita:

Una implementación puede aceptar otras formas de expresiones constantes.

Simplemente

 const char S[] = "ABCD"; 

Deberia trabajar.

¿Cuál es tu comstackdor?

Otra opción es utilizar sprintf.

Por ejemplo,

 char buffer[50]; sprintf( buffer, "My String" ); 

Buena suerte.

Esto se comstack bien en la versión 4.3.3 de gcc (Ubuntu 4.3.3-5ubuntu4).

 const char s[] = "cheese"; int main() { return 0; } 
 const char S[] = "ABCD"; 

Esto debería funcionar. Utilizo esta notación solamente y funciona perfectamente bien para mí. No sé cómo estás usando.

Error raro

¿Puedes probar esto?

 const char* const S = "ABCD"; char t[] = { S[0], S[1], S[2], S[3] }; char u[] = { S[3], S[2], S[1], S[0] }; 

Aquí está la solución oscura: definir la función de macro:

 #define Z(x) \ (x==0 ? 'A' : \ (x==1 ? 'B' : \ (x==2 ? 'C' : '\0'))) char x[] = { Z(0), Z(1), Z(2) }; 

Ese es uno de los casos en que un script para generar el código apropiado podría ayudar.

El problema de comstackción solo ocurre para mí (gcc 4.3, ubuntu 8.10) si las tres variables son globales. El problema es que C no funciona como un lenguaje de script, por lo que no puede darse por sentado que la inicialización de u y t se produce después de la de s. Es por eso que obtienes un error de comstackción. Ahora, no puedes inicializar t y y de la forma en que lo hiciste antes, por eso necesitarás un char *. El código que hace el trabajo es el siguiente:

 #include  #include  #define STR "ABCD" const char s[] = STR; char* t; char* u; void init(){ t = malloc(sizeof(STR)-1); t[0] = s[0]; t[1] = s[1]; t[2] = s[2]; t[3] = s[3]; u = malloc(sizeof(STR)-1); u[0] = s[3]; u[1] = s[2]; u[2] = s[1]; u[3] = s[0]; } int main(void) { init(); puts(t); puts(u); return EXIT_SUCCESS; } 

No estoy seguro de cuál es tu problema, pero lo siguiente parece funcionar bien:

 #include  int main() { const char s0[] = "ABCD"; const char s1[] = { s0[3], s0[2], s0[1], s0[0], 0 }; puts(s0); puts(s1); return 0; } Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved. cl /Od /D "WIN32" /D "_CONSOLE" /Gm /EHsc /RTC1 /MLd /W3 /c /ZI /TC .\Tmp.c Tmp.c Linking... Build Time 0:02 C:\Tmp>tmp.exe ABCD DCBA C:\Tmp> 

Edición 9 junio 2009

Si necesita acceso global, es posible que necesite algo feo como este:

 #include  const char *GetString(int bMunged) { static char s0[5] = "ABCD"; static char s1[5]; if (bMunged) { if (!s1[0]) { s1[0] = s0[3]; s1[1] = s0[2]; s1[2] = s0[1]; s1[3] = s0[0]; s1[4] = 0; } return s1; } else { return s0; } } #define S0 GetString(0) #define S1 GetString(1) int main() { puts(S0); puts(S1); return 0; } 

Tal vez su matriz de caracteres necesita ser constante. Como está inicializando su matriz con caracteres de una cadena constante, su matriz debe ser constante. Prueba esto:

 #define S "ABCD" const char a[] = { S[0], S[1], S[2], S[3] };