Cadenas en C, cómo obtener subString

Tengo una cadena:

char * someString; 

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

 #include  ... 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 
 char* someString = "abcdedgh"; char* otherString = 0; otherString = (char*)malloc(5+1); memcpy(otherString,someString,5); otherString[5] = 0; 

ACTUALIZAR :
Consejo: una buena forma de entender las definiciones se llama regla derecha-izquierda (algunos enlaces al final):

Comience a leer desde el identificador y diga en voz alta => ” someString is …”
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 ve 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.

Eso funciona con cualquier cosa … pruébalo:

 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: cómo interpretar declaraciones complejas de C / C ++ y cómo leer declaraciones de C

Generalizado

 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); } 

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

 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 ().

Puede usar snprintf para obtener una subcadena de una matriz char con precisión. Aquí hay un ejemplo de archivo llamado “substring.c”:

 #include  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:

Esta es una cadena

Nota:

Para más información, consulte la página del manual printf.

 strncpy(otherString, someString, 5); 

No te olvides de asignar memoria para otherString.

 #include  #include  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 usa la instrucción printf y si pone constantes en todos los progtwigs menos los más pequeños es de mala calidad y debe evitarse.

Hacerlo todo en dos caídas:

 char *otherString = strncpy((char*)malloc(6), someString); otherString[5] = 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 

Creo que es una forma fácil … pero no sé cómo puedo pasar la variable de resultado directamente, luego creo una matriz local como temperatura temporal 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; }