2010-08-14 28 views
5

Para hacer una cadena de una cadena nula i escribió esto:Hacer una cadena nula en una sola línea

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
int main() 
{ 
    char str[15]="fahad uddin"; 
    strlen(str); 
    puts(str); 
    for(int i=0;str[i]!='\0';i++) 
     strcpy(&str[i],"\0") ; 
    puts(str); 
    getch(); 
    return 0; 
} 

Antes de esto he intentado:

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
int main() 
{ 
    char str[15]="fahad uddin"; 
    strlen(str); 
    puts(str); 
    for(int i=0;str[i]!='\0';i++,strcpy(&str[i],"\0")) 
     ; 
    puts(str); 
    getch(); 
    return 0; 
} 

En el primer ejemplo, el programa funciona bien mientras que en el segundo ejemplo imprime la primera letra de la cadena (en este ejemplo F). ¿Por qué es esto?

+6

En 1 línea sería 'str [0] = '\ 0';'. – kennytm

+0

ja, ja, a prO señor :) –

+0

para (char * p = str; * p; * p ++ = '\ 0'); –

Respuesta

10

Las cadenas C tienen terminación nula. Siempre que solo use las funciones suponiendo cadenas terminadas en nulo, podría simplemente poner a cero el primer carácter.

str[0] = '\0'; 
5

for(int i=0;str[i]!='\0';i++,strcpy(&str[i],"\0")); - el i ++ se incrementa antes de que se ejecute strcpy - por lo que tomará la dirección de str [1] en la primera iteración - omitiendo str [0] - por lo tanto obtendrá el primer caracter.

Tenga en cuenta que la respuesta de KennyTM es una forma mucho mejor de hacerlo, pero supongo que está aprendiendo/experimentando.

+0

Leí que las expresiones proceden de derecha a izquierda.strcpy() debería continuar entonces? –

+0

Si desea utilizar este enfoque, entonces sí, strcpy debe estar en el lado izquierdo de la coma; los elementos se ejecutan de izquierda a derecha. –

+0

Dije que proceden de izquierda a derecha, es decir strcpy en este ejemplo debe realizarse primero y luego i ++ –

3

Debido i++,strcpy(&str[i],"\0") evalúa la i++ antes de que se evalúa la llamada a strcpy() que utiliza ahora el valor incrementado de i como su destino. En efecto, omite el primer carácter de su cadena.

Tenga en cuenta que hay formas mucho mejores de hacer lo que desea.

KennyTM menciona simplemente establecer el primer carácter en '\0' con str[0] = '\0';, que no borra todos los bytes pero marca la cadena como de longitud cero. También hay memset() que se usa para llenar un bloque de memoria con cualquier valor arbitrario, y 0 está ciertamente permitido.

Además, llamar al strcpy() es mucho menos eficiente que simplemente asignar a cada elemento de str[] en el bucle.

-2

intento con este código:

bzero(string_name, size_of_string); 

Además, incluyen el archivo lib <string.h>. Creo que esto debe funcionar

+1

'bzero' es una función BSD heredada que duplica el' memset' estándar de C'.No debería recomendarse para un nuevo código. –

7
memset(str,0,strlen(str)); /* should also work */ 
memset(str,0,sizeof str); /* initialize the entire content */ 
Cuestiones relacionadas