2012-07-30 27 views
7

¿Alguien puede explicarme lo que no entiendo aquí, por favor?pasar matriz de caracteres como argumento

Estoy tratando de pasar el argumento como una "cadena" (sé que no hay cadenas en c) para poder usar esa cadena más tarde con otras funciones, como por ejemplo, un nombre de archivo que debe pasarse. Pero no sé por qué no lo aceptará o qué tipo debería ser

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    char *array= argv[0]; 
    foo(*array); 
} 

void foo(char *array) 
// notice the return type - it's a pointer 
{ 
    printf(array); 
} 

gracias mucho!

+0

deferenciarlo gama mientras que pasa a foo. Así que solo pasa el primer valor de byte si es un literal de cadena c – Lefteris

+0

Debe evitar una expresión como 'printf (s)' porque es una cadena de formato no controlada. – md5

Respuesta

17

Usted debe llamar a la función como esta:

foo(array); 

Lo que está haciendo es dereferencing el puntero, que devuelve un char, que es el primer carácter de la cadena.

Su llamada printf también debe tener este aspecto:

printf("%s", array); 

su totalidad código fijo debe ser similar a la siguiente:

#include <stdio.h> 

void foo(char *array) 
{ 
    printf("%s", array); 
} 

int main (int argc, char *argv[]) 
{ 
    // TODO: make sure argv[1] exists 
    char *array= argv[1]; 
    foo(array); 
} 
+0

quité el asterix como dijiste, ¡todavía no funciona! Dice: redefinición: diferentes tipos básicos – Ryan

+0

Sí, eso es un problema completamente nuevo; usando 'printf' incorrectamente. – chris

+0

hice ambas correcciones, todavía dice lo mismo y no compilará! – Ryan

5

Cuando dice foo (*array), estás en descomposición de la matriz en una puntero al primer elemento, para desreferenciar ese elemento, dándole el primer carácter. Eso es lo que intentas pasar a la función. Deje fuera el asterisco y simplemente pase array para que se descomponga en el puntero que necesita.

El otro problema es que no está utilizando printf correctamente. Antes que nada, aquí hay un reference. Necesita pasar una cadena de tokens que le dicen al compilador qué tipo de argumento esperar a continuación porque no tiene forma de saberlo. En su caso, su cadena contendría "%s" para decirle que esperara un char *, y luego pasaría array como ese argumento char *.

printf ("The string is %s", array); 
+0

eliminé el asterix como dijiste, ¡todavía no funciona! Dice: redefinición: diferentes tipos básicos – Ryan

+0

¿Noté que reeditó a cómo era antes? ¿Habrá un asterisco en el argumento que se pasa a la función o no? De hecho, acabo de notarlo con o sin él, no funcionará – Ryan

+0

@Ryan. No debería desreferenciar la matriz decaída en ninguna parte. Ya se descompuso en el puntero que necesita cuando pasa a una función. – chris

1

argv es una matriz de punteros a carácter, lo que significa argv va a almacenar la dirección de todas las cadenas que se pasa como argumento de la línea de comandos.

por lo argv[0] voluntad le da la dirección de la primera cadena que se pasa como argumento de la línea de comandos, que se va a almacenar en la variable puntero array en main función.

Ahora solo debe pasar la dirección a la función foo pero está pasando el primer caracter de esa cadena. Por ejemplo, si su primer argumento de línea de comando es temp.txt, está pasando el carácter t a la función foo. De modo que dentro de la función foo tiene una variable 0 array, en ese valor ASCII del carácter t se le asignará. Y luego lo está pasando al printf, que pisa el valor de ASCII como dirección, e intenta acceder a esa dirección para imprimir, lo que provocará un bloqueo (comportamiento inesperado).

Por lo tanto, solo debe pasar la dirección del argumento de línea de comando a la función foo como se muestra a continuación.

foo(array);

printf(array) - Aquí printf se pisa el especificador de formato como cadena (%s) y se trata de imprimir todos los caracteres a partir de la dirección hasta el array se encuentra con un carácter nulo \0.

Pero es mejor agregar el printf, como a continuación

printf("%s", array);

+0

excelente explicación! ¡Gracias! – Ryan

Cuestiones relacionadas