2010-11-10 14 views
10

Quiero inicializar la cadena en C para vaciar la cadena. Traté:Inicialice una cadena en C para vaciar la cadena

string[0] = ""; 

pero escribí

"warning: assignment makes integer from pointer without a cast" 

¿Cómo debo hacer entonces?

+1

¿Cuál es el punto de declarar una cadena de 0 caracteres? – cdhowie

+0

¿Cuál es el tipo de su 'cadena'? ¿Es un puntero de char o una matriz de char? – nos

+0

¿Qué es 'cadena'? – leppie

Respuesta

5

Asumiendo que su matriz llamada 'cadena' ya existe, intente

string[0] = '\0'; 

\0 es el terminador NULL explícita, requerido para marcar el final de la cadena.

+22

Semnatically, debería ser 'string [0] = '\ 0';' ... –

+0

@badgerr: ¿podría cambiar su respuesta para usar ''\ 0''? – pevik

20

que desea establecer el primer carácter de la cadena a cero, como esto:

char myString[10]; 
myString[0] = '\0'; 

(O myString[0] = 0;)

O, en realidad, en la inicialización, puede hacerlo:

char myString[10] = ""; 

Pero esa no es una manera general de establecer una cadena a una longitud cero una vez que se ha definido.

+0

Esfuerzo mínimo.:) –

+3

'char myString [1] =" ";' ¿seguro? Necesitas espacio para el terminador nulo. – JeremyP

+1

Corrección: podría hacer 'char myString [10] =" ";' – ruslik

3

Asignación de cadenas literales a char matriz sólo se permite durante la declaración:

char string[] = ""; 

Esto declara cadena como una matriz de caracteres de tamaño 1 y lo inicializa con \0.

Pruebe esto también:

char str1[] = ""; 
char str2[5] = ""; 
printf("%d, %d\n", sizeof(str1), sizeof(str2)); //prints 1, 5 
12

Además de la versión de Will Dean, los siguientes son comunes para toda la inicialización de búfer:

char s[10] = {'\0'}; 

o

char s[10]; 
memset(s, '\0', sizeof(s)); 

o

char s[10]; 
strncpy(s, "", sizeof(s)); 
1
string[0] = ""; 
"warning: assignment makes integer from pointer without a cast

Ok, vamos a bucear en la expresión ...

0 un int: representa el número de caracteres (suponiendo string es (o decaído en) un char *) para avanzar desde el principio del objeto string

string[0]: el objeto char situado al principio de la objetar string

"": cadena literal: un objeto de tipo char[1]

=: asignación de operadora: tries para asignar un valor de tipo char[1] a un objeto del tipo char. char[1] (decayed to char*) y char no son compatibles con la asignación, pero el compilador confía en usted (el programador) y sigue adelante con la asignación de todos modos al convertir el tipo char* (char[1] decayed a) en int --- y obtiene el advertencia como una bonificación. Tiene un compilador muy bueno :-)

+0

Obtendría más votos ascendentes si tuviera una solución; esta es una buena explicación de lo que está pasando. – wizzwizz4

+0

Estoy de acuerdo @ wizzwizz4, pero me gusta mi respuesta tal como es. ¡Gracias! – pmg

2

calloc asigna la memoria solicitada y le devuelve un puntero. También establece la memoria asignada a cero.

En caso de que va a utilizar su string cadena como vacío todo el tiempo:

char *string = NULL; 
string = (char*)calloc(1, sizeof(char)); 

En caso de que va a almacenar algún valor en su string más tarde:

char *string = NULL; 
int numberOfChars = 50; // you can use as many as you need 
string = (char*)calloc(numberOfChars + 1, sizeof(char)); 
0

creo Amarghosh respondió correctamente. Si desea inicializar una cadena vacía (sin saber el tamaño) la mejor manera es:

//this will create an empty string without no memory allocation. 
char str[]="";// it is look like {0} 

Pero si desea inicializar una cadena con una asignación de memoria fija que puede hacer:

// this is better if you know your string size.  
char str[5]=""; // it is look like {0, 0, 0, 0, 0} 
0

¡Es un poco tarde, pero creo que su problema puede ser que haya creado una matriz de longitud cero, en lugar de una matriz de longitud 1.

Una cadena es una serie de caracteres seguida de un terminador de cadena ('\0'). Una cadena vacía ("") no consta de caracteres seguidos de un único carácter de terminación de cadena, es decir, un carácter en total.

Así que me gustaría probar el siguiente:

string[1] = ""

Tenga en cuenta que este comportamiento no es el emulado por strlen, que no cuenta el terminador como parte de la longitud de la cadena.