Cadenas y caracteres con printf

3 minutos de lectura

avatar de usuario
Aspirar

Estaba confundido con el uso de %c y %s en el siguiente programa en C

#include <stdio.h>
    
void main()
{
    char name[]="siva";
    printf("%s\n",name);
    printf("%c\n",*name);
}

La salida es

siva
s

Por qué necesitamos usar el puntero para mostrar un carácter %c, y el puntero no es necesario para una cadena

Recibo un error cuando uso

printf("%c\n", name);

el error que tengo es

str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’

Si intentas esto:

#include<stdio.h>

void main()
{
 char name[]="siva";
 printf("name = %p\n", name);
 printf("&name[0] = %p\n", &name[0]);
 printf("name printed as %%s is %s\n",name);
 printf("*name = %c\n",*name);
 printf("name[0] = %c\n", name[0]);
}

La salida es:

name = 0xbff5391b  
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s

Entonces, ‘nombre’ es en realidad un puntero a la matriz de caracteres en la memoria. Si intenta leer los primeros cuatro bytes en 0xbff5391b, verá ‘s’, ‘i’, ‘v’ y ‘a’

Location     Data
=========   ======

0xbff5391b    0x73  's'  ---> name[0]
0xbff5391c    0x69  'i'  ---> name[1]
0xbff5391d    0x76  'v'  ---> name[2]
0xbff5391e    0x61  'a'  ---> name[3]
0xbff5391f    0x00  '\0' ---> This is the NULL termination of the string

Para imprimir un carácter, debe pasar el valor del carácter a printf. El valor puede ser referenciado como nombre[0] o *nombre (ya que para un arreglo nombre = &nombre[0]).

Para imprimir una cadena, debe pasar un puntero a la cadena para imprimir (en este caso, ‘nombre’ o ‘& nombre[0]’).

%c

está diseñado para un solo carácter, un carácter, por lo que imprime solo un elemento. Al pasar la matriz de caracteres como un puntero, está pasando la dirección del primer elemento de la matriz (que es un solo carácter) y luego se imprimirá:

s

printf("%c\n",*name++);

imprimirá

I

y así …

El puntero no es necesario para el %s porque puede funcionar directamente con cadenas de caracteres.

Está confundiendo el operador de desreferencia * con la anotación de tipo de puntero *. Básicamente, en C * significa diferentes cosas en diferentes lugares:

  • En un tipo, * significa un puntero. int es un tipo entero, int* es un puntero a tipo entero
  • Como operador de prefijo, * significa ‘desreferencia’. nombre es un puntero, *nombre es el resultado de desreferenciarlo (es decir, obtener el valor al que apunta el puntero)
  • Por supuesto, como operador infijo, * significa ‘multiplicar’.

  • * en referencia a un puntero, siempre significa lo mismo. simplemente lo estás pensando demasiado (un signo de inteligencia). Míralo así, int *myintptr; significa que la dirección del puntero myintptr está haciendo referencia almacenará un inty el *myintptr = 5; significa que la dirección del puntero myintptr se hace referencia debe contener un 5. el * siempre significa “el valor en”.

    – joe peletier

    30 de diciembre de 2016 a las 8:17

avatar de usuario
troyano

El nombre de una matriz es la dirección de su primer elemento, por lo que name es un puntero a la memoria que contiene la cadena “siva”.

Además, no necesita un puntero para mostrar un carácter; solo está eligiendo usarlo directamente desde la matriz en este caso. Podrías hacer esto en su lugar:

char c = *name;
printf("%c\n", c);

avatar de usuario
Chhavi

Si desea mostrar un solo carácter, también puede usar name[0] en lugar de usar el puntero.

Servirá para su propósito, pero si desea mostrar la cadena completa usando %cpuedes probar esto:

#include<stdio.h>
void main()
{ 
    char name[]="siva";
    int i;
    for(i=0;i<4;i++)
    {
        printf("%c",*(name+i));
    }
} 

avatar de usuario
gaétan virac

El caso es que la función printf necesita un puntero como parámetro. Sin embargo, un char es una variable a la que tiene acceso directo. Una cadena es un puntero en el primer carácter de la cadena, por lo que no tiene que agregar el * porque * es el identificador del puntero de una variable.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad