Documentos de Académico
Documentos de Profesional
Documentos de Cultura
h>
int main ()
{
int i, j, primo,l;
primo = 1;
printf("Introduzca un numero: \n");
scanf("%d", &l);
Aqui mi ejemplo de funcion, pero da error, me podrian decir en donde tengo el error(es)?
int primos(int c)
{
int a,j,p;
int num=0;
p=1;
for(a=2 ; a<num ; a++)
{
for(j=2 ; j<=a/2 ; j++)
if ((a%j) == 0)
p = 0;
if(p)
printf("%d\n", a);
p = 1;
return (num);}
}
int main()
int a,b,c,d;
scanf("%d",&a);
scanf("%d",&b);
c=mcd(a,b);
if(c<0) c*=-1;
d=mcm(a,b);
if(d<0) d*=-1;
return 0;
return (a*b)/mcd(a,b);
CARACTERES Y CADENAS EN C.
El tipo Carcter en C
El tipo Cadena en C
E/S de Caracteres y Cadenas - Problemas derivados del uso de un
tampn
Funciones de tratamiento de cadenas
Ejercicios propuestos
char letra;
signed char letraconsigno;
unsigned char letrasinsigno;
letraconsigno = -65;
printf("Letraconsigno es %d y su valor decimal es %d.\n\n",
letraconsigno,letraconsigno);
letrasinsigno = 165;
printf("Letrasinsigno es %u y su valor decimal es %d.\n\n",
letrasinsigno,letrasinsigno);
return 0;
}
Ejemplo
#include<stdio.h>
void main(void)
{
printf("Escriba una letra y pulse intro, por favor: ");
scanf("%c", &unaletra);
Qu ha pasado?
*/
void main(void)
{
printf("Escriba una cadena: ");
scanf("%s", cadena); /* Las cadenas NO llevan & */
/*
* Funciones de concatenacin
*/
Encabezado Descripcin
Esta funcin aade s2 a s1 y pone
un '\0' al final del resultado; se
supone que s1 contiene espacio
char *strcat (char *s1, const char
*s2); suficiente para el total de caracteres
(los de s1, los de s2 y el '\0').
Proporciona como resultado un puntero
de s1
Anloga a la anterior, pero aade
char *strncat (char *s1, const char a s1 un mximo den caracteres de s2.
*s2, size_t n); Proporciona como resultado un puntero
de s1
/*
* Funciones de comparacin
*/
Encabezado Descripcin
int memcmp (const void *s1, const
void *s2, size_t n); Compara byte por byte las dos cadenas
cuya direccin se proporciona,
suponiendo que ambas
tuvieran n bytes de longitud. Si ambas
series de bytes son iguales, la funcin
proporciona el valor 0. Si no son
iguales, la funcin devuelve la
diferencia entre los dos primeros bytes
distintos. La comparacin es numrica,
sin tener en cuenta el orden alfabtico
internacional, lo cual produce
resultados extraos cuando las
cadenas contienen signos diacrticos.
Esta funcin compara byte por byte las
cadenas de caracteres sealadas
por s1 y s2. El resultado es:
int strcmp (const char *s1, const
char *s2); negativo si s1 es menor que s2
nulo si s1 y s2 son iguales
positivo si s1 es mayor que s2
funciones.h /* CONSTANTES */
#define NUM_BYTES 128
#define LONGITUD_1 64
#define LONGITUD_2 64
/*
* funciones.c
* cadenas
*
* Created by coti on 28/08/09.
* Copyright 2009 Tests by Coti. All rights reserved.
*
*/
#include "funciones.h"
#include <stdio.h>
/* malloc() vive aqu */
#include <stdlib.h>
/* toupper() vive aqu */
#include <ctype.h>
/* Las funciones viven aqu */
#include "funciones.h"
/*
Este programa muestra ejemplos de las operaciones
fundamentales con cadenas:
- declaracin (esttica)
- lectura
- escritura
- recorrido
- comparacin
- concatenacin
- bsqueda de fragmentos
main.c */
Comentarios
Este programa consta de dos archivos, y se puede compilar desde la lnea de
rdenes, o empleando cualquier IDE. Vanse las pginas
man
correspondientes a las distintas funciones.
La arquitectura de programa es muy bsica; si se aade una funcin ms ser
preciso modificar el programa principal. Sera posible emplear otra arquitectura
menos engorrosa?
Ana
Perez
Lopez
Bernardo
Introduccin
Vamos ahora a ver cmo manejar texto con C. Para empezar, es preciso decir que
existe un tipo string como en otros lenguajes, pero no existe un tipo de datos
especfico para almacenar texto, sino que se utilizan arrays de char. Funcionan
igual que los dems arrays con la diferencia de que ahora se manejan letras en
vez de nmeros. Se les llama cadenas, strings o tiras de caracteres y a partir de
ahora les llamaremos cadenas.
Para declarar una cadena se hace como en el caso de un array. Por ejemplo, si
queremos declarar una cadena de longitud 20 caracteres se hara:
char texto[20];
#include <stdio.h>
main()
{
char nombre[20];
Tambin puede llamar la atencin sobre la forma de imprimir el array. Con slo
usar %s ya se imprime su totalidad. Ya veremos esto ms adelante.
#include <stdio.h>
main()
{
char texto[20];
texto = "Hola";
}
Es interesante saber cmo funciona una cadena por dentro, por eso vamos a ver
primero cmo se inicializa:
#include <stdio.h>
main()
{
char nombre[] = "Gandalf";
Resultado al ejecutar:
Texto: Gandalf
Tamao de la cadena: 8 bytes
Curiosamente la respuesta nos dice que "Gandalf" ocupa 8 bytes. Como cada
elemento char ocupa un byte eso quiere decir que la cadena tiene 8 elementos, a
pesar de que "Gandalf" slo cuenta con 7 letras. La razn de esta aparente
paradoja estriba en que la cadena tiene como carcter final el smbolo '\0', cuyo
significado es "fin de cadena". De esta forma, cuando queremos escribir la
cadena basta con usar %s y el compilador sabe cuntos elementos debe escribir:
hasta que encuentre '\0'.
main()
{
char nombre[] = { 'G', 'a', 'n', 'd', 'a', 'l', 'f', '\0' };
#include <stdio.h>
main()
{
char nombre[] = { 'G', 'a', 'n', 'd', 'a', 'l', 'f' };
En mi ordenador se obtiene:
Texto: Gandalf-
Pero en otro despus de "Gandalf" puede aparecer cualquier cosa. Lo que aqu
sucede es que printf no encuentra el smbolo '\0' y no sabe cundo dejar de
imprimir. Afortunadamente, cuando introducimos una cadena se hace de la
primera forma y el C se encarga de poner el smbolo al final.
strlen
strcpy
strcat
sprintf
strcmp
Para usar estas funciones en nuestro programa hay que aadir la directiva:
#include <string.h>
strlen
size_t *strlen(const char *cadena);
Esta funcin devuelve el nmero de caracteres que tiene la cadena (sin contar
el '\0').
#include <stdio.h>
#include <string.h>
main()
{
char texto[]="Gandalf";
int longitud;
longitud = strlen(texto);
printf( "La cadena \"%s\" tiene %i caracteres.\n", texto,
longitud );
}
#include <stdio.h>
#include <string.h>
main()
{
char texto[]="Gandalf";
char *p;
int longitud=0;
p = texto;
while (*p != '\0') {
longitud++;
printf( "%c\n", *p ); /* Mostramos la letra actual */
p++; /* Vamos a la siguiente letra
*/
}
printf( "La cadena \"%s\" tiene %i caracteres.\n", texto,
longitud );
}
strcpy
char *strcpy(char *cadena1, const char *cadena2);
Copia el contenido de cadena2 en cadena1. cadena2 puede ser una variable o una
cadena directa (por ejemplo, "hola"). Debemos tener cuidado de que la cadena
destino (cadena1) tenga espacio suficiente para albergar a la cadena origen
(cadena2).
#include <stdio.h>
#include <string.h>
main()
{
char texto[] = "ste es un curso de C.";
char destino[50];
Vamos a ver otro ejemplo en el que la cadena destino es una cadena constante
("ste es un curso de C.") y no una variable. Adems, en este ejemplo vemos que
la cadena origen es sustituida por la cadena destino totalmente. Si la cadena
origen es ms larga que la destino, se eliminan las letras adicionales.
#include <stdio.h>
#include <string.h>
main()
{
char destino[50]="ste no es un curso de HTML, sino de C.";
strcat
char *strcat(char *cadena1, const char *cadena2);
#include <stdio.h>
#include <string.h>
main()
{
char nombre_completo[50];
char nombre[]="Gandalf";
char apellido[]="el Gris";
Como siempre, tenemos asegurar que la variable en la que aadimos las dems
cadenas tenga el tamao suficiente. Con la primera lnea de este programa
introducimos el nombre en nombre_completo. Usamos strcpy para asegurarnos de
que queda borrado cualquier dato anterior. Luego usamos un strcat para aadir
un espacio y, finalmente, introducimos el apellido.
sprintf
int sprintf(char *destino, const char *format, ...);
#include <stdio.h>
#include <string.h>
main()
{
char nombre_completo[50];
char nombre[]="Gandalf";
char apellido[]="el Gris";
strcmp
int strcmp(const char *cadena1, const char *cadena2);
#include <stdio.h>
#include <string.h>
main()
{
char nombre1[]="Gandalf";
char nombre2[]="Frodo";
El resultado es:
Arrays de cadenas
Un array de cadenas puede servirnos para agrupar una serie de mensajes. Por
ejemplo, todos los mensajes de error de un programa. Luego, para acceder a cada
mensaje, basta con usar su nmero.
#include <stdio.h>
#include <string.h>
main()
{
error( 2 );
}
El resultado ser:
#include <stdio.h>
#include <string.h>
#define ELEMENTOS 5
main()
{
char *dichos[ELEMENTOS] = {
"La avaricia rompe el saco",
"Ms vale pjaro en mano que ciento volando",
"No por mucho madrugar amanece ms temprano",
"Ao de nieves, ao de bienes",
"A caballo regalado no le mires el diente"
};
char *temp;
int i, j;
printf( "Lista desordenada:\n" );
for( i=0; i<ELEMENTOS; i++ )
printf( " %s.\n", dichos[i] );
Para ver con mayor claridad el resultado a partir del desarrollo del proceso, se va
a sustituir cada cadena por su primera letra (menos la de "Ao de nieves..." que
se sustituir por A). As, el proceso queda:
0 1 2 3 3' 4 4' 5 6 6' 7 7' 8 8'
9 9' 10 10'
1 L L L L A A A
2 M M M M M M M M M L L A
3 N N N N N N N N N N N N N M
M L
4 A A A A L L L L L M M M M N
N N N M
5 A A A A A A A A A A A L L L
L M M N
#include <stdio.h>
#include <string.h>
main()
{
char cadena[]="El puerto paralelo del PC";
char *p;
int espacios = 0, letras_e = 0;
p = cadena;
while (*p != '\0') {
if (*p == ' ') espacios++;
if (*p == 'e') letras_e++;
p++;
}
El resultado es:
Para recorrer la cadena necesitamos un puntero p que sea de tipo char. Debemos
hacer que p apunte a la cadena (p=cadena). As, p apunta a la direccin del primer
elemento de la misma. El valor de *p sera, por tanto, 'E'. Comenzamos el bucle.
La condicin comprueba que no se ha llegado al final de la cadena (*p != '\0').
Entonces se comprueba si en la direccin a la que apunta p hay un espacio o una
letra e. Si es as, se incrementan las variables correspondientes. Una vez
comprobado esto se pasa a la siguiente letra (p++).
#include <stdio.h>
#include <string.h>
main()
{
char cadena[]="El puerto paralelo del PC";
char *p;
p = cadena;
while (*p != '\0') {
if (*p == ' ') *p = '-';
p++;
}
y se obtiene: