-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathej4-1_strindex.c
181 lines (164 loc) · 6.1 KB
/
ej4-1_strindex.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/**
* Archivo / @File: ej4-1_strindex.c
*
* Fecha / @Date: Lunes 01 de Agosto de 2022 / Monday August 01, 2022
*
* Última Modificación / Last Modification: Lunes 01 de Agosto de 2022 / Monday August 01, 2022
*
* Autor / @Author: Ezequiel Hernán Villanueva
*
*
* [ Spanish ]
*
* 4. Funciones y la estructura del programa
*
* 4.1 Conceptos Básicos de Funciones
* Para comenzar, diseñemos y escribamos un programa que imprima cada línea
* de su entrada que contenga un "patrón" o cadena de caracteres en particular.
* (Este es un caso especial del programa grep de UNIX). Por ejemplo, al buscar
* el patrón de letras "ould" en el conjunto de líneas
*
* Ah Love I could you and I with Fate conspire
* To grasp this sorry Scheme of Things entire,
* Would not we shatter it to bits -- and then
* Re-mould it nearer to the Heart's Desire!
*
* producirá la salida
* Ah Love I could you and I with Fate conspire
* Would not we shatter it to bits -- and then
* Re-mould it nearer to the Heart's Desire!
*
* El trabajo se ajusta ordenadamente en tres partes
*
* while(hay otra línea)
* if(la línea contiene el patrón)
* imprímela
*
* Aunque ciertamente es posible poner el código de todo esto en main, una mejor
* forma es aprovechar la estructura haciendo de cada parte una función separada.
* Es más fácil trabajar con tres piezas pequeñas que con una grande, debido
* a que los detalles irrelevantes se pueden ocultar dentro de las funciones, y minimizar
* así el riesgo de interacciones no deseadas. Los fragmentos incluso se pueden
* emplear en otros programas.
*
* "Mietras hay otra línea" es getline, función que ya escribimos en el capítulo 1,
* e "imprímela" es printf, que alguien ya nos proporcionó. Esto significa que solo necesitamos
* escribir una rutina para decidir si la línea contiene una ocurrencia del patrón.
*
* Podemos resolver ese problema escribiendo una función strindex(s,t), que regresa
* la posición o índice en la cadena s en donde comienza t, o -1 si s no contiene a t.
* Debido a que los arreglos en C principian en la posición cero, los índices será cero o positivos,
* y así un valor negativo como -1 es conveniente para señalar una falla. Cuando posteriormente se necesite
* una coincidencia de patrones más elaborada, solo se debe reemplazar strindex, el resto del código
* puede permanecer igual. (La Biblioteca estandar provee una función strstr que es semejante a strindex,
* excepto en que regresa una apuntador en lugar de un índice.)
*
* Una vez definido todo este diseño, llenar los detalles del programa es simple.
* Aquí esta en su totalidad, de modo que se puede ver como las piezas quedan juntas.
* Por ahora, el patrón que se buscará es una cadena literal, lo cuál no es el mecanismo más general.
* Regresaremos en breve a una discusión sobre como inicializar arreglos de caracteres, y en le Capítulo 5
* mostraremos como hacer que el patrón de caracteres sea un parámetro fijado cuando se ejecuta el programa.
* También hay una versión ligeramente diferente de getline, que se podrá comparar con la del Capítulo 1.
*
*
* [ English ]
*
* 4. Functions and the structure of the program
* ...
*
*
*
*
*
* Some source code files with examples from The Book
* "The C Language Programming, Second Edition
* By Brian W. Kernighan & Dennis M. Ritchie"
* a Compiled Programming Language.
* Use "gcc - GNU project C and C++ compiler"
* for various GNU\Linux based Operative Systems.
*
* Edited a little time ago!
*
* You can Copy / Edit / Change / Distribute
* GNU GPL License Software Version 3.0
*
* For Educational Purpose.
*
*/
#include <stdio.h>
//#include <string.h>
//#include <limits.h>
//#include <float.h>
//#include <math.h>
#include <string.h>
// Declaración de CONSTANTES SIMBÓLICAS para evitar LOS NÚMEROS MÁGICOS
// Declaration of SYMBOLIC CONSTANTS for avoid THE MAGICS NUMBERS
#define MAXLINE 1000
/*
* Tamaño máximo de la línea de entrada
* "tanto texto como sea posible"
* para un int de 16 bits el rango de valores es [ -32768, +32767 ] pag. 10
*
* Maximun length of input textline
* "as much text as possible"
* for a 16-bit int the range of values is [-32768, +32767] p. 10
*/
// Declaración de las VARIABLES EXTERNAS
// Declaration of the EXTERN VARIABLES
char pattern[] = "ould"; // patrón por buscar
//int max; // máxima longitud de una línea vista hasta el momento
//char line[MAXLINE]; // línea de entrada actual
//char longest[MAXLINE]; // línea mas larga se guarda aquí
// Declaración de los PROTOTIPOS de las FUNCIONES getaline y copy
// Declaration of the PROTOTYPES OF THE FUNCTIONS and
int getaline( char line[], int max );
int strindex( char source[], char searchfor[] );
/*
* Definición de la FUNCIÓN: int strindex( char source[], char searchfor[] )
*
* Busca el patrón searchfor[] en la cadena de caracteres de entrada source
*
* Regresa el índice de searchfor[] en source[], -1 si no existe
*/
int strindex( char source[], char searchfor[])
{
int i,j,k;
for( i = 0 ; source[i] != '\0' ; i++ )
{
for ( j = i , k = 0 ; searchfor[k] != '\0' && source[j] == searchfor[k]; j++,k++)
;
if( k > 0 && searchfor[k] == '0' )
return i;
}
return -1;
}
/*
* Definición de la función: int getaline( char line[], int max)
*
* Trae la línea y la pone en line, regresa su longitud
*/
int getaline( char line[] , int max)
{
int c,i;
i = 0;
while( --max > 0 && (c = getchar()) != EOF && c != '\n')
line[i++] = c;
if( c == '\n')
line[i++] = c;
line[i] = '\0';
return i;
}
// Programa Principal
// Main Program
int main( int c, char * argv[] )
{
char line[MAXLINE];
int found = 0;
while ( getaline( line, MAXLINE ) > 0 )
if( strindex( line , pattern ) >= 0 )
{
printf("%s", line);
found++;
}
return found;
}