sprintf_s sprintf snprintf plus c string

c - snprintf - sprintf r



snprintf para concatenacion de cuerdas (4)

¿Por qué no usar strncat() ? Fue diseñado para hacer exactamente esto:

char buf[20] = ""; strncat(buf, "foo", sizeof buf); printf("%s/n", buf); strncat(buf, " bar", sizeof buf - strlen(buf)); printf("%s/n", buf);

Si su sistema lo admite, puede usar strncat_s() lugar de strncat , ya que tiene un nivel adicional de protección contra desbordamiento y evita la necesidad de calcular el número de bytes que quedan en el búfer de salida.

Si debe usar snprintf , deberá crear un puntero separado para realizar un seguimiento del final de la cadena. Este puntero será el primer argumento que pase a snprintf . Su código actual siempre usa buf , lo que significa que siempre se imprimirá al principio de esa matriz. Puede usar strlen para encontrar el final de la cadena después de cada llamada a snprintf , o puede usar el valor de retorno de snprintf para incrementar el puntero.

Estoy usando snprintf para concatenar una cadena a una matriz de caracteres:

char buf[20] = ""; snprintf(buf, sizeof buf, "%s%s", buf, "foo"); printf("%s/n", buf); snprintf(buf, sizeof buf, "%s%s", buf, " bar"); printf("%s/n", buf);

El problema es la segunda concatenación de buf lugar de agregar "bar" , reemplaza "foo" con ella. La salida es como:

foo bar

El primer %s debe mantener buf (que en este caso contiene "foo" ) allí. Y el segundo %s debería adjuntarle "bar" . ¿Derecha?

¿Qué estoy haciendo mal?


Está violando el contrato de restrict en snprintf , que establece que ningún otro argumento puede superponerse con el búfer.

Copiar la entrada en sí mismo es una pérdida de esfuerzo de todos modos. snprintf devuelve la cantidad de caracteres que requeriría el formato, así que aproveche esto para agregar:

char buf[20] = ""; char *cur = buf, * const end = buf + sizeof buf; cur += snprintf(cur, end-cur, "%s", "foo"); printf("%s/n", buf); if (cur < end) { cur += snprintf(cur, end-cur, "%s", " bar"); } printf("%s/n", buf);


Mientras que la respuesta aceptada es correcta, la mejor respuesta (en mi opinión) es que concatenar cadenas es incorrecto. Debe construir la salida completa en una sola llamada a snprintf . Ese es el punto central del uso de funciones de salida formateadas, y es mucho más eficiente y seguro que hacer aritmética de punteros y llamadas múltiples. Por ejemplo:

snprintf(buf, sizeof buf, "%s%s%s", str_a, str_b, str_c);


Prueba esto:

char buf[20]; snprintf(buf, sizeof buf, "%s", "foo"); printf("%s/n", buf); int len = strlen(buf); snprintf(buf+len, (sizeof buf) - len, "%s", " bar"); printf("%s/n", buf);

La salida es "foo bar". El primer argumento para snprintf, un puntero a un personaje, es donde comenzará a rellenar los caracteres. No presta atención a lo que ya está en el búfer. Sin embargo, la función strlen presta atención. Cuenta la cantidad de caracteres antes del nul (0) que snprintf puso allí. Así que en lugar de pasar buf, pase buf + strlen (buf). También puedes usar strncat, que sería un poco más eficiente.

Veo la etiqueta C ++ debajo de tu pregunta. Busque std :: string. Mucho mejor.