2010-08-31 8 views
8
char out_file_name[30]; 


ogSize = strlen(FileName); //i.e. - FileName_anylength.log (always.log) 
ogSize -= strlen(IN_FILE_SUFFIX); //amount of chars before .log 

strncpy(out_file_name, FileName, ogSize); //out_file_name now is FileName_anylength (without the .log) 

¿Es esta la mejor manera de hacerlo?¿Hay alguna otra forma de truncar una cadena?

Además, ¿cómo puedo evitar que ogSize tenga más de 30 caracteres ya que proviene de la entrada del usuario?

Gracias.

+1

¿Quiere decir anteponer? O extracción de cuerdas? ¿Truncar? –

+1

Creo que te refieres a "truncar" (quieres eliminar elementos del final de la cadena, truncarlo a una longitud más corta, ¿no?) –

+0

truncar - ese es el caso. Gracias. Lo siento, el inglés es mi primer idioma ... sí primero, por eso es tan malo. –

Respuesta

17

Con una cadena estilo C, puede simplemente configurar el carácter que desea truncar en \0.

En cuanto a su segunda pregunta, básicamente la verifica. O puede asignar tanta memoria como necesite, en función del tamaño de la cadena (recuerde incluir espacio para ese \0).

+1

+1 Buen truco.Strlen se detendrá en la primera instancia de '\ 0' –

+0

@jkerian: Buena solución, gracias. –

2

dar a este un aspecto:

char *trunc; 
char *outfile; 

strdup(outfile, FileName); 

if (((trunc = strstr(out_file_name, ".log")) != NULL) 
*trunc = '\0'; 

return (outfile); // assumes returning result from function 
+0

strdup no es ANSI C (no C89, no C99) – user411313

+0

Es suficientemente conocido y estándar para usarse con seguridad en la mayoría de los entornos: IEEE 1003.1, 2004, (http://www.opengroup.org/onlinepubs/009695399/functions /strdup.html); SVr4, 4.3BSD, POSIX.1-2001 (http://linux.die.net/man/3/strdup) y Unix 98 (http://www.mkssoftware.com/docs/man3/strdup.3. áspid). Además, mi solución no hace suposiciones sobre la longitud de la cadena fuente y la preserva. – BillP3rd

2

Tomando primero su última pregunta, asegurando un tamaño máximo es bastante fácil. Normalmente desea utilizar fgets para leer la cadena. Esto le permite especificar una longitud máxima. De forma alternativa, puede especificar un tamaño máximo en un formato de escaneo (por ejemplo, "%29s" o "%29[^\n]"). Tenga en cuenta la diferencia entre los dos: con fgets, especifique el tamaño del búfer, pero con scanf especifica uno menor que el tamaño del búfer (es decir, el número máximo de caracteres para leer).

En cuanto a la primera pregunta: sí, en general hay mejores maneras. strncpy es una función extraña, originalmente escrita para un propósito bastante específico, y (para ser honesto) probablemente debería eliminarse de la biblioteca estándar, porque aunque parece como debería ser útil, casi nunca lo es.

Probablemente haga las cosas un poco diferente. Una posibilidad sería utilizar snprintf, algo así como:

snprintf(
    out_file_name, 
    sizeof(out_file_name), 
    "%*s", 
    strlen(FileName) - strlen(IN_FILE_SUFFIX), FileName); 
+1

si out_file_name no es una matriz, su ejemplo no funciona. snprintf no es C89 – user411313

2

fgets uso() para leer la cadena del usuario, de esa manera se puede especificar una longitud máxima de la cadena

char* from = FileName; 
char* to = out_file_name; 
int curLen = 0; 

do 
{ 
    *to++=*from++ 
} 
while(*from && *from!='.' && ++curLen < ogSize); 

*to='\0'; 
+1

no funciona para más de un '.' desde – user411313

1

Puede inserte un nulo en la cadena para acortarlo. Debajo de la función strstr() se usa para encontrar la dirección de la primera aparición de ".log". Después de eso, puede restar las dos direcciones entre sí para conocer la longitud del nombre y dónde insertar el nulo.

int main() { 
    char suffix[] = ".log"; 
    char filename[] = "FileName_anylength.log"; 
    char* end_address = strstr(filename, suffix); 
    filename[end_address-filename] = 0; 
    printf("%s", filename); 
} 
+1

@ BillP3rd - Disculpas Bill, me acabo de dar cuenta de que teníamos respuestas similares. Me gusta el tuyo mejor, sin sustracción. - ¡Salud! :) – skimobear

1
char out_file_name[30]; 
char *suffix=".log"; 
size_t IN_FILE_SUFFIX = strlen(suffix); 

/* also works, if suffix occurs more than 1 time or never ! */ 
if(strstr(out_file_name, suffix)) 
    out_file_name[ strlen(out_file_name) - IN_FILE_SUFFIX ] = 0; 

o

char out_file_name[30]; 
char *suffix=".log"; 
size_t IN_FILE_SUFFIX = strlen(suffix); 

/* also works, if suffix occurs more than 1 time or never ! */ 
if(strstr(out_file_name, suffix)) 
{ 
    char format[20]; 
    sprintf(format, "%%.%ds", strlen(out_file_name) - IN_FILE_SUFFIX); 
    sprintf(out_file_name, format, out_file_name); 
} 
Cuestiones relacionadas