2010-01-22 14 views
40

tengo una cadena:cadenas en C, cómo conseguir subCadena

char * someString; 

Si quiero las primeras cinco cartas de esta cadena y quiero ponerlo en otherString, ¿cómo lo haría?

+4

someString no es una cadena, es un puntero a una cadena de caracteres. Además, los caracteres no son necesariamente letras. Necesitas saber qué es una cuerda antes de mover las letras. – jbcreix

+0

Dependiendo de su necesidad, es mejor declarar una matriz de caracteres de tamaño 6 para otras cadenas (5 + un byte para '\ 0'). De esta forma, no tiene que preocuparse por las pérdidas de memoria en caso de que olvide liberar otra cadena después de usarla. – HeretoLearn

Respuesta

42
#include <string.h> 
... 
char otherString[6]; // note 6, not 5, there's one there for the null terminator 
... 
strncpy(otherString, someString, 5); 
otherString[5] = '\0'; // place the null terminator 
+3

@pib: otherString [5] = '\ 0'; –

+3

O 'otherString [5] = (char) 0;' Si quieres ser exigente al respecto. Char es un tipo entero, por lo que los compiladores no se quejarán (o no deberían) de simplemente asignarle un entero sin formato. – pib

+0

Gracias por recordarme que coloque el carácter de terminación en comillas simples en lugar de comillas dobles. – Seagull

6
char* someString = "abcdedgh"; 
char* otherString = 0; 

otherString = (char*)malloc(5+1); 
memcpy(otherString,someString,5); 
otherString[5] = 0; 

ACTUALIZACIÓN:
Consejo: Una buena manera de entender las definiciones se llama la regla derecha-izquierda (algunos enlaces al final):

empezar a leer desde identificador y decir en voz alta = > "someString es ..."
Ahora ve a la derecha de someString (la instrucción ha finalizado con un punto y coma, nada que decir).
Ahora vaya a la izquierda del identificador (* se encuentra) => entonces diga "... un puntero a ...".
Ahora vaya a la izquierda de "*" (se encuentra la palabra clave char) => say "..char".
¡Hecho!

Así que char* someString; => "someString es un puntero a char".

Como un puntero simplemente apunta a una cierta dirección de memoria, también se puede usar como el "punto de partida" para una "matriz" de caracteres.

que funciona con cualquier cosa .. darle una oportunidad:

char* s[2]; //=> s is an array of two pointers to char 
char** someThing; //=> someThing is a pointer to a pointer to char. 
//Note: We look in the brackets first, and then move outward 
char (* s)[2]; //=> s is a pointer to an array of two char 

Algunos enlaces: How to interpret complex C/C++ declarations y How To Read C Declarations

+1

Creo que deberías intentar compilar 'char * [] someThing;' y 'char [] * someThing;'. Desea 'char * someThing [];' y 'char (* someThing) [];' respectivamente. Y eso rompe tu algoritmo para comprender las definiciones. –

+0

// Gracias, tienes razón sobre la mala sintaxis ... solucionó el código. Sin embargo, el algoritmo sigue en pie, ver la actualización. – Liao

+0

No olvide liberar después de malloc – ShihabSoft

0
strncpy(otherString, someString, 5); 

No se olvide de asignar memoria para otherString.

+2

Tenga en cuenta que esto puede dar como resultado una cadena sin terminar (si 'someString' contiene cinco o más caracteres). – strager

3

Necesitará asignar memoria para la nueva cadena otherString. En general, para una subcadena de longitud n, algo así como esto puede funcionar para usted (no se olvide de hacer la comprobación de límites ...)

char *subString(char *someString, int n) 
{ 
    char *new = malloc(sizeof(char)*n+1); 
    strncpy(new, someString, n); 
    new[n] = '\0'; 
    return new; 
} 

Esto devolverá una subcadena de los primeros n caracteres de someString. Asegúrese de liberar la memoria cuando haya terminado con free().

+0

compruebe el valor de retorno de malloc – pm100

+0

... o algo completamente nuevo ... 'char * new = new char [n + 1]' :-) – dolphin

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

int main() 
{ 
     char someString[]="abcdedgh"; 
     char otherString[]="00000"; 
     memcpy (otherString, someString, 5); 
     printf ("someString: %s\notherString: %s\n", someString, otherString); 
     return 0; 
} 

No necesitará stdio.h si no se utiliza la instrucción printf y constantes que ponen en todo menos en los programas más pequeña es de mala forma y debe ser evitado.

+0

Necesita establecer otherString [5] = '\ 0' también –

+0

Otrostring después de que memcpy no es una cadena C válida ya que no tiene terminación nula. Después de la memcpy necesita agregar otra cadena [5] = '\ 0'; – HeretoLearn

+0

O puede memset (otra cadena, '\ 0', sizeof (otra cadena)); antes de usarlo – HeretoLearn

5

generalizada:

char* subString (const char* input, int offset, int len, char* dest) 
{ 
    int input_len = strlen (input); 

    if (offset + len > input_len) 
    { 
    return NULL; 
    } 

    strncpy (dest, input + offset, len); 
    return dest; 
} 

char dest[80]; 
const char* source = "hello world"; 

if (subString (source, 0, 5, dest)) 
{ 
    printf ("%s\n", dest); 
} 
+0

Será mejor si agregas '\ 0' a dest [len + 1] ¿no? – JoseLinares

0

Hacerlo todo en dos redadas cayó:

char *otherString = strncpy((char*)malloc(6), someString); 
otherString[5] = 0; 
+0

nunca haga esto. tienes que comprobar que el malloc funcionó. – pm100

+0

@ pm100 Estoy de acuerdo, pero nadie más lo fue, así que pensé que estaba implícito. –

0
char largeSrt[] = "123456789-123"; // original string 

char * substr; 
substr = strchr(largeSrt, '-');  // we save the new string "-123" 
int substringLength = strlen(largeSrt) - strlen(substr); // 13-4=9 (bigger string size) - (new string size) 

char *newStr = malloc(sizeof(char) * substringLength + 1);// keep memory free to new string 
strcpy(newStr, largeSrt, substringLength); // copy only 9 characters 
newStr[substringLength] = '\0'; // close the new string with final character 

printf("newStr=%s\n", newStr); 

free(newStr); // you free the memory 
0

Creo que es manera fácil ... pero no sé cómo puedo pasar el variable de resultado directamente luego creo una matriz de caracteres local como temp y la devuelvo.

char* substr(char *buff, uint8_t start,uint8_t len, char* substr) 
{ 
    strncpy(substr, buff+start, len); 
    substr[len] = 0; 
    return substr; 
} 
0

Puede usar snprintf para obtener una subcadena de una matriz de caracteres con precisión. Aquí es un ejemplo de archivo llamado "substring.c":

#include <stdio.h> 

int main() 
{ 
    const char source[] = "This is a string array"; 
    char dest[17]; 

    // get first 16 characters using precision 
    snprintf(dest, sizeof(dest), "%.16s", source); 

    // print substring 
    puts(dest); 
} // end main 

Salida:

Ésta es una cadena

Nota:

Para más información consulte la página man printf .