¿Cómo se representa el char vacío?

84

Actualmente estoy escribiendo un pequeño programa, pero sigo recibiendo este error al compilar

error: constante de carácter vacío

Me doy cuenta de que es porque estoy tratando de reemplazar un carácter válido con un espacio vacío, c[i]=''pero no he podido encontrar otra forma de representarlo.

BartoszKP
fuente
No hay "espacio vacío" (terminología incorrecta), aunque puede haber una cadena vacía. ¿Desea reemplazarlo c[i]con un espacio en blanco , o desea "eliminar" ese carácter de la matriz como lo haría en un editor cuando presiona la tecla de retroceso (es decir, desea los caracteres c [i-1] yc [ i + 1] para volverse adyacentes después de la operación)?
Lorenzo Donati - Codidact.com
1
Si comprende las cadenas, en el momento de la declaración, puede asignar una char c[5] = "";cadena vacía, pero char c = '';no es válida como se explica a continuación en las 6 respuestas.
Grijesh Chauhan

Respuestas:

131

Puede usar c[i]= '\0'o simplemente c[i] = (char) 0.

El carácter nulo / vacío es simplemente un valor de cero, pero también se puede representar como un carácter con un cero de escape.

ardiente
fuente
11
Sí, y no hay "char vacío". '\0'es el carácter nulo que no tiene nada que ver con NULL; el carácter nulo es simplemente un carácter que tiene 0 como código numérico.
Lorenzo Donati - Codidact.com
@LorenzoDonati Me refiero a él como el carácter nulo, el carácter vacío era solo para usar la terminología de OP. También lo he aclarado en mi edición. Como notas de chux, NULL no es muy bueno para acuerdos de referencia sin puntero, así que también hice esa nota.
ardiente
1
@LorenzoDonati Sí, he decidido eliminarlo ya que no agrega nada a esta respuesta y parece fuera de contexto para la discusión en cuestión.
ardiente
@LorenzoDonati No null chardebería ser nul char soltero l.
Grijesh Chauhan
2
No existen los caracteres vacíos. Llamar al carácter nulo un carácter vacío es simplemente incorrecto.
Christoffer Hammarström
28

No puede almacenar "ningún carácter" en un carácter, no tiene sentido.

Como alternativa, puede almacenar un carácter que tenga un significado especial para usted, por ejemplo, carácter nulo '\0', y tratarlo de manera especial.

occulus
fuente
5
Creo que esta es una respuesta mucho mejor que la aceptada, que confunde un carácter nulo y un carácter vacío. Como analogía, es como decir que no puede declarar un int y almacenar 'ningún número', debe almacenar algún valor.
simonwo
4
Puede tener una cadena nula ""porque una cadena es una secuencia de cero o más caracteres, pero un carácter es exactamente un valor, ni cero ni más.
Simonwo
11

El carácter de espacio vacío sería ' '. Si está buscando un valor nulo, sería '\0'.

Claudiu
fuente
10

Sí, c[i]=''no es un código válido. Entre paréntesis, carácter constante entre ' ', por ejemplo, c[i] = 'A';char A. pero no escribe ningún carácter en el medio ''.

El espacio vacío no es más que suponga que si desea un espacio asignado, haga lo siguiente:

si quiere ser asignado nul char, haga:

Ejemplo: suponga que si c[]una cadena ( \0matriz de caracteres terminada en nul ) si tiene una cadena. por ejemplo:

Y reemplaza el segundo carácter con espacio :

y si lo imprime usando printf de la siguiente manera:

entonces la salida sería:

Y reemplaza el segundo carácter con '\ 0' :

entonces la salida sería:

porque la cadena terminó con \0.

Grijesh Chauhan
fuente
¿Qué pasa si tenemos algunos caracteres después del '\ 0'? Quiero decir, supongamos que queremos eliminar un carácter de la cadena, por ejemplo, "muestra" eliminar m. ¿No hay una manera de reemplazarlo por algún carácter vacío hipotético en lugar de eliminarlo desplazando el carácter a la izquierda después de él?
Himanshu Poddar
5

No existe el "carácter vacío" ''.

Si necesita un carácter de espacio, que se puede representar como un espacio: c[i] = ' 'o como su equivalente octal ASCII: c[i] = '\040'. Si necesitas un personaje NUL, eso es c[i] = '\0'.

verboso
fuente
4

Para representar el hecho de que el valor no está presente, tiene dos opciones:

1) Si todo el charrango es significativo y no puede reservar ningún valor, utilice en char*lugar de char:

Entonces tendrás c[i] == NULLpara cuando el personaje no esté presente y de lo contrario *c[i]para personajes ordinarios.

2) Si no necesita algunos valores representables char, reserve uno para indicar que el valor no está presente, por ejemplo, el '\0'carácter.

Entonces tendrás c[i] == '\0'para cuando el personaje no esté presente y los personajes ordinarios de lo contrario.

BartoszKP
fuente
3
La pregunta está etiquetada con c , no c ++
Spikatrix
@CoolGuy Buen punto, tienes razón. Sin embargo, el punto de la respuesta sigue en pie, haciendo abstracción de la forma en que se realiza la asignación de memoria.
BartoszKP
4

Hay dos formas de hacer la misma instrucción, es decir, una cadena vacía. La primera forma es asignar una cadena vacía en la memoria estática:

o, si quieres ser explícito:

La forma publicada arriba es solo para un personaje. Y, la segunda forma:

No olvides usar free () con este porque strdup () usa malloc dentro.

Nick Cuevas
fuente
2

Puede resultar útil asignar un valor nulo en una cadena en lugar de convertir explícitamente algún índice en el carácter nulo '\0'. Lo he usado para probar funciones que manejan cadenas, asegurándose de que se mantengan dentro de sus límites apropiados.

Con:

Esto crea una matriz de tamaño 8 con valores:

Kyle s
fuente
0

String before = EMPTY_SPACE+TAB+"word"+TAB+EMPTY_SPACE;

Donde EMPTY_SPACE = "" (esto es String) TAB = '\ t' (esto es Character)

String after = before.replaceAll(" ", "").replace('\t', '\0');

significa después = "palabra"

Stefanidis
fuente