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?
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?
#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
@pib: otherString [5] = '\ 0'; –
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
Gracias por recordarme que coloque el carácter de terminación en comillas simples en lugar de comillas dobles. – Seagull
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
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. –
// Gracias, tienes razón sobre la mala sintaxis ... solucionó el código. Sin embargo, el algoritmo sigue en pie, ver la actualización. – Liao
No olvide liberar después de malloc – ShihabSoft
strncpy(otherString, someString, 5);
No se olvide de asignar memoria para otherString.
Tenga en cuenta que esto puede dar como resultado una cadena sin terminar (si 'someString' contiene cinco o más caracteres). – strager
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().
#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.
Necesita establecer otherString [5] = '\ 0' también –
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
O puede memset (otra cadena, '\ 0', sizeof (otra cadena)); antes de usarlo – HeretoLearn
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);
}
Será mejor si agregas '\ 0' a dest [len + 1] ¿no? – JoseLinares
Hacerlo todo en dos redadas cayó:
char *otherString = strncpy((char*)malloc(6), someString);
otherString[5] = 0;
nunca haga esto. tienes que comprobar que el malloc funcionó. – pm100
@ pm100 Estoy de acuerdo, pero nadie más lo fue, así que pensé que estaba implícito. –
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 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;
}
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 .
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
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