2011-01-30 29 views
12

¿Hay alguna forma de imprimir solo una parte de una cadena?Imprimir parte de una cadena en C

Por ejemplo, si tengo

char *str = "hello there"; 

¿Hay una manera de imprimir sólo "hello", teniendo en cuenta que la subcadena Quiero imprimir es de longitud variable, no siempre 5 caracteres?

Sé que podría usar un bucle for y putchar o que podría copiar el conjunto y luego agregar un terminador nulo, pero me pregunto si hay una manera más elegante?

+0

¿cuál es el carácter o los criterios que desea detener el? es difícil responder a esta pregunta sin aclarar – kelloti

Respuesta

28

Prueba esto:

int length = 5; 
printf("%*.*s", length, length, "hello there"); 
+2

Estuve 7 segundos demasiado lento =) – SiegeX

+1

@SiegeX: Sip - agregando el 'include \ nintmain (void) \ n {' lo hizo en ... :-) –

+0

Por supuesto, si quiere imprimir en stderr, o un archivo, o una etiqueta en alguna GUI, el clásico 'printf' no ayudará. ¿Quizás también anotes sprintf/fprintf? –

14

Esto también funcionará:

fwrite(str, 1, len, stdout); 

no va a tener la sobrecarga de analizar el especificador de formato. Obviamente, para ajustar el comienzo de la subcadena, simplemente puede agregar el índice al puntero.

+0

Aunque I * love * con el formato de estilo 'printf', esta es la respuesta más simple y por lo tanto más elegante. – dummydev

1

Puede usar strncpy para duplicar la parte de la cadena que desea imprimir, pero debe tener cuidado de agregar un terminador nulo, ya que strncpy no lo hará si no encuentra uno en el cadena fuente Una solución mejor, como señaló Jerry Coffin, es usar la función *printf apropiada para escribir o copiar la subcadena que desee.

Mientras strncpy puede ser peligroso en manos de alguien que no está acostumbrado a ella, puede ser más rápido en términos de tiempo de ejecución en comparación con una solución de estilo printf/sprintf/fprintf, ya que no es ninguno de los gastos indirectos de hacer frente a la formatear cadenas. Mi sugerencia es evitar strncpy si puede, pero es bueno saberlo por si acaso.

size_t len = 5; 
char sub[6]; 
sub[5] = 0; 
strncpy(sub, str + 5, len); // char[] to copy to, char[] to copy from(plus offset 
          // to first character desired), length you want to copy 
0

printf y amigos de trabajo bien cuando eso es todo lo que quiere hacer con la cadena parcial, pero para una solución más general:

char *s2 = s + offset; 
char c = s2[length]; // Temporarily save character... 
s2[length] = '\0'; // ...that will be replaced by a NULL 
f(s2); // Now do whatever you want with the temporarily truncated string 
s2[length] = c;  // Finally, restore the character that we had saved 
+1

Esto le dará a UB si pasa un literal de cadena (que es lo que muestra el OP ...) –