2010-02-07 22 views

Respuesta

44

Tenga una mirada en la función strcat.

En particular, se podría intentar esto:

const char* name = "hello"; 
const char* extension = ".txt"; 

char* name_with_extension; 
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */ 
strcpy(name_with_extension, name); /* copy name into the new var */ 
strcat(name_with_extension, extension); /* add the extension */ 
+18

¡No olvides poner nombre con la extensión! –

+0

gracias, esto funcionó muy bien – user69514

+2

¿Puedes escribir 'const char * name, * extension'? Un literal de cadena es * no * a 'char * '. – ephemient

8

primera copia la cadena actual a un conjunto más amplio con strcpy, a continuación, utilizar strcat.

Por ejemplo, usted puede hacer:

char* str = "Hello"; 
char dest[12]; 

strcpy(dest, str); 
strcat(dest, ".txt"); 
5

Se puede copiar y pegar una respuesta aquí, o usted podría ir leer lo que nuestro anfitrión Joel tiene que decir sobre strcat.

+2

enlace muy bueno – dubbeat

1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *name = "hello"; 

int main(void) { 
    char *ext = ".txt"; 
    int len = strlen(name) + strlen(ext) + 1; 
    char *n2 = malloc(len); 
    char *n2a = malloc(len); 

    if (n2 == NULL || n2a == NULL) 
    abort(); 

    strlcpy(n2, name, len); 
    strlcat(n2, ext, len); 
    printf("%s\n", n2); 

    /* or for conforming C99 ... */ 
    strncpy(n2a, name, len); 
    strncat(n2a, ext, len - strlen(n2a)); 
    printf("%s\n", n2a); 

    return 0; // this exits, otherwise free n2 && n2a 
} 
14

que tienen una matriz de caracteres:

char* name = "hello"; 

no, usted tiene un puntero a un carácter string literal. En muchos usos, puede agregar el modificador const, dependiendo de si está más interesado en a qué apunta , o el valor de la cadena, "hello". No debe intentar modificar el literal ("hola"), porque bad things can happen.

Lo más importante para transmitir es que C no tiene un tipo de cadena adecuado (o de primera clase). Las "cadenas" suelen ser matrices de caracteres (caracteres) con un carácter nulo de terminación ('\ 0' o decimal 0) para indicar el final de una cadena o punteros a matrices de caracteres.

que sugeriría leer matrices de caracteres, sección 1.9 en El Lenguaje de Programación C (la página 28 segunda edición). Recomiendo encarecidamente la lectura de este pequeño libro (< 300 páginas), con el fin de aprender C

En respuesta a su pregunta, secciones 6 - Arrays and Pointers y la sección 8 - Characters and Strings del C FAQ podría ayudar. La pregunta 6.5 y 8.4 podrían ser buenos lugares para comenzar.

Espero que eso lo ayude a comprender por qué su fragmento no funciona. Otros han explicado qué cambios son necesarios para que funcione. Básicamente, necesitas una matriz de caracteres (una matriz de caracteres) lo suficientemente grande como para almacenar toda la cadena con un carácter de terminación (final) '\ 0'. Luego puede usar la función de biblioteca de C estándar strcpy (o mejor aún strncpy) para copiar el "Hola" en ella, y luego quiere concatenar usando la función estándar de la biblioteca C strcat (o mejor aún strncat). Deberá incluir el archivo de encabezado string.h para declarar las declaraciones de funciones.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char filename[128]; 
    char* name = "hello"; 
    char* extension = ".txt"; 

    if (sizeof(filename) < strlen(name) + 1) { /* +1 is for null character */ 
     fprintf(stderr, "Name '%s' is too long\n", name); 
     return EXIT_FAILURE; 
    } 
    strncpy(filename, name, sizeof(filename)); 

    if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1)) { 
     fprintf(stderr, "Final size of filename is too long!\n"); 
     return EXIT_FAILURE; 
    } 
    strncat(filename, extension, (sizeof(filename) - strlen(filename))); 
    printf("Filename is %s\n", filename); 

    return EXIT_SUCCESS; 
} 
4

asprintf no es 100% estándar, pero está disponible a través de las bibliotecas estándar de C de GNU y BSD, por lo que es probable que tenga la misma. Asigna la salida, por lo que no tiene que sentarse allí y contar los caracteres.

char *hi="Hello"; 
char *ext = ".txt"; 
char *cat; 

asprintf(&cat, "%s%s", hi, ext);