definiendo e iterando a través de un conjunto de cadenas en c

¿Cómo puedo definir una matriz de cadena en c y luego iterar con un bucle a través de los elementos en la matriz?

Hasta ahora tengo

char myStrings[][10] = { "one", "two", "three", "four", "five" }; // do I need to specify the "10" maximum length? // also does it automatically create a null ending character after the string? int i = 0; for( i = 0; i < ; i++) { // I need to pass each string to a function which accepts // const char * } 

Cuando declara una secuencia de caracteres con "" , se agrega un terminador nulo.

 char myStrings[][10] = { "one", "two", "three", "four", "five" }; size_t i = 0; for( i = 0; i < sizeof(myStrings) / sizeof(myStrings[0]); i++) { fooThatReceivesOneString(myStrings[i]); } 
 void loopftn (void) { char *numbers[] = {"One", "Two", "Three", ""}, **n; n = numbers; while (*n != "") { printf ("%s\n", *n++); } return; } 
  1. No necesitas tener una longitud máxima.
  2. Todas las cadenas en C están terminadas en nulo.

¿Necesito especificar la longitud máxima de “10”?

Sí, aparte de la primera dimensión de la matriz, debe mencionar todas las dimensiones posteriores

¿También crea automáticamente un carácter final nulo después de la cadena?

Necesito pasar cada cadena a una función que acepte const char *

Puede pasar cada cadena de esta manera:

 for( i = 0; i < ; i++) { foo(myStrings[i]); } 

Además, puedes elegir entre const char* y char* ; ya que has declarado esto como una matriz es modificable; si hubiera sido algo así como

 const char *mystrings[] = { " ", " "}; // string literal 

entonces debes pasarlo como const char* porque los literales de cadena siempre deben ser const char*

anuncio 1) necesitas especificar una longitud

anuncio 2) Sí, los literales de cadena tienen un final nulo.

Dentro de su for, simplemente llame a la función con el parámetro myStrings [i].

Sí, debe especificar la longitud o agregar una entrada NULA como la última entrada en su matriz de cadenas. C no lo hace automáticamente por ti.

Prueba esto..

 int j =0; while (char myStrings[][j] !='\0'){ i++; } for (i = 0; i < j; i++) { somemethod(myStrings[][i]); } 

Siempre lo hago así, me parece elegante y fácil.
Simplemente defina una matriz como de costumbre, sin índice fijo.
Todo lo que tienes que asegurarte es agregar un solo 0 al final.
Luego, puede hacer el caso TEST más corto posible e iterarlo con for o while.

Aquí hay un ejemplo, muestra una lista de opciones y el elemento de ayuda de adaptación (en ese caso, la matriz de ayuda debe ser al menos tan larga como la opción).

 const char *options[]={ "CAL_MAG_MIN", "CAL_MAG_MAX", 0 }; const char *help[]={ "", "", 0 }; int pos; for (pos=0;options[pos];pos++) { printf("\t %s %s\n",options[pos],help[pos]); } 

En C, la statement como se muestra arriba ** n! = “”, Es ilegal a primera vista. Compara un puntero con una cadena. Incluso * n! = “”, Compararía el puntero de la cadena con el “” puntero de la cadena de stack, no las cadenas. Debería usar strcmp o comparar el primer carácter ** n == ‘\ 0’ o ** n == 0. También + * n incrementa el carácter int la cadena señalada, no el puntero a la cadena …

Aquí hay una buena implementación:

Código:

 static const char* strings[]={"asdf","asdfasdf",0}; const char** ptr = strings; while(*ptr != 0) { printf("%s \n", *ptr); ++ptr; } 

Esto podría ayudar

 int main() { int upp; int num; char password[20]; int i; printf("Enter a Password (Must include a special char, a number, and an uppercase letter): \n"); scanf(" %s", password); for (i=0;i