Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
102 | Capítulo 3: Tipos numéricos, expresiones y salida Usted especifi ca el nombre de una variable string (aquí, myName), luego un punto y después el nombre de la función y la lista de argumentos. La función length no requiere que le pasen argu- mentos, pero se deben usar paréntesis para indicar una lista de argumentos vacía. Asimismo, length es una función de devolución de valor, así que la llamada de función debe aparecer dentro de una expresión: string fi rstName; string fullName; fi rstName = "Alexandra"; cout << fi rstName.length() << endl; // Prints 9 fullName = fi rstName + " Jones"; cout << fullName.length() << endl; // Prints 15 Quizá se pregunte acerca de la sintaxis en una llamada de función como fi rstName.length() Esta expresión usa una notación C++ llamada notación de punto. Hay un punto entre el nombre de variable fi rstName y el nombre de función length. Algunos tipos de datos defi nidos por el progra- mador, como string, tienen funciones que están estrechamente relacionadas con ellos, y la notación de punto se requiere en las llamadas de función. Si olvida usar la notación de punto y escribe la llamada de función como length() obtiene un mensaje de error al momento de compilar, algo como “UNDECLARED IDENTIFIER”. El compilador piensa que usted está tratando de llamar a una función ordinaria denominada length, no la función length relacionada con el tipo string. En el capítulo 4 se analiza el signifi cado de la notación de punto. Algunas personas se refi eren a la longitud de una cadena como su tamaño. Para acomodar ambos términos, el tipo string proporciona una función llamada size. Tanto fi rstName.size() como fi rstName.length() devuelven el mismo valor. Se dice que la función length devuelve un valor entero sin signo. Si se desea guardar el resul- tado en una variable len, como en len = fi rstName.length(); entonces, ¿qué se debe declarar en cuanto a la identidad del tipo de datos de len? Para evitar tener que adivinar si unsigned int o unsigned long es correcto para el compilador particular con que se está trabajando, el tipo string defi ne un tipo de datos size_type para que se pueda usar string fi rstName; string::size_type len; fi rstName = "Alexandra"; len = fi rstName.length(); Observe que es necesario usar el nombre califi cado string::size_type (de la manera como se hizo con los identifi cadores en los espacios de nombre) porque de otro modo la defi nición de size_type se oculta dentro de la defi nición del tipo string. Antes de dejar las funciones length y size, se debe hacer una observación acerca del uso de mayúsculas en los identifi cadores. En las normas dadas en el capítulo 2 se dijo que en este libro se comienzan con mayúscula los nombres de funciones defi nidas por el usuario y tipos de datos. Se DALE003.indd 102DALE003.indd 102 4/12/06 18:56:584/12/06 18:56:58 www.FreeLibros.me sigue esta convención al escribir nuestras propias funciones y tipos de datos en capítulos posteriores. Sin embargo, no se tiene control sobre el uso de mayúsculas en elementos provistos por la bibliote- ca estándar de C++. Los identifi cadores de la biblioteca estándar se escriben por lo general con mi- núsculas. Función fi nd La función fi nd busca una cadena para hallar la primera concurrencia de una subcadena particular y devuelve un valor entero sin signo (de tipo string:: size_type) que da el resultado de la búsque- da. La subcadena, pasada como un argumento para la función, puede ser una cadena literal o una expresión string. Si str1 y str2 son de tipo string, las siguientes son llamadas de función váli- das: str1.fi nd("the") str1.fi nd(str2) str1.fi nd(str2 + "abc") En cada caso anterior, se busca en str1 para ver si dentro de ella se puede hallar la subcadena es- pecifi cada. Si es así, la función devuelve la posición en str1 donde comienza la correspondencia. (Las posiciones se numeran comenzando en 0, de modo que el primer carácter de una cadena está en la posición 0, el segundo está en la posición 1, y así sucesivamente.) Para una búsqueda exitosa, la correspondencia debe ser exacta, incluso el uso idéntico de mayúsculas. Si no se puede hallar la subcadena, la función devuelve el valor especial string::npos, una constante nombrada que sig- nifi ca “no es una posición dentro de la cadena”. (string::npos es el valor más grande de tipo string::size_type, un número como 4294967295 en muchas máquinas. Este valor es adecuado para “no es una posición válida” porque las operaciones string no permiten que ninguna cadena adquiera esta longitud.) Dado el segmento de código string phrase; string::size_type position; phrase = "El perro y el gato"; la sentencia position = phrase.fi nd("el"); asigna a position el valor 12, mientras que la sentencia position = phrase.fi nd("rata"); asigna a position el valor string::npos, porque no hubo corresponencia. El argumento para la función fi nd puede ser también un valor char. En este caso, fi nd busca la primera ocurrencia de ese carácter dentro de la cadena y devuelve su posición (o string::npos, si no se encontró el carácter). Por ejemplo, el segmento de código string theString; theString = "Abracadabra"; cout << theString.fi nd('a'); produce el valor 3, que está en la posición de la primera ocurrencia de una a minúscula en theString. A continuación se dan algunos ejemplos más de llamadas para la función fi nd, suponiendo que se ha ejecutado el siguiente segmento de código: string str1; string str2; str1 = "Programming and Problem Solving"; str2 = "gram"; 3.8 Más operaciones de cadena | 103 DALE003.indd 103DALE003.indd 103 4/12/06 18:56:594/12/06 18:56:59 www.FreeLibros.me 104 | Capítulo 3: Tipos numéricos, expresiones y salida Llamada de función Valor devuelto por la función str1.fi nd("and") 12 str1.fi nd("Programming") 0 str2.fi nd("and") string::npos str1.fi nd("Pro") 0 str1.fi nd("ro" + str2) 1 str1.fi nd("Pr" + str2) string::npos str1.fi nd(' ') 11 Observe en el cuarto ejemplo que hay dos copias de la subcadena "Pro" en str1, pero fi nd devuelve sólo la posición de la primera copia. Observe también que las copias pueden ser palabras separadas o partes de palabras; fi nd solamente intenta hacer corresponder la secuencia de caracteres dada en la lista de argumentos. En el ejemplo fi nal se demuestra que el argumento puede ser tan simple como un solo carácter, incluso un solo espacio en blanco. Función substr La función substr devuelve una subcadena particular de una cadena. Suponiendo que myString es de tipo string, aquí se da una llamada de función: myString.substr(5, 20) El primer argumento es un entero sin signo que especifi ca una posición dentro de la cadena, y el segundo es un entero sin signo que especifi ca la longitud de la subcadena deseada. La función de- vuelve la parte de la cadena que empieza con la posición especifi cada y continúa para el número de caracteres dados por el segundo argumento. Observe que substr no cambia a myString; devuelve un nuevo valor string temporal, que es copia de una parte de la cadena. A continuación se dan algunos ejemplos, suponiendo que la sentencia myString = "Programming and Problem Solving"; se ha ejecutado. Llamada de función Cadena contenida en el valor devuelto por la función myString.substr(0, 7) "Program" myString.substr(7, 8) "ming and" myString.substr(10, 0) "" myString.substr(24, 40) "Solving" myString.substr(40, 24) Ninguna. El programa termina con un mensaje de error de ejecución. En el tercer ejemplo, especifi car una longitud de 0 produce como resultado la cadena nula. En el cuarto ejemplo se muestra lo que sucede si el segundo argumento especifi ca más caracteres de los que están presentes después de la posición de inicio: substr devuelve los caracteres desde la posición inicial hasta el fi n de la cadena. En el último ejemplo se ilustra que el primer argumento, la posición, no debe estar más alládel fi n de la cadena. Debido a que substr devuelve un valor de tipo string, puede usarlo con el operador de con- catenación (+) para copiar partes de cadenas y unirlas para formar nuevas cadenas. Las funciones DALE003.indd 104DALE003.indd 104 4/12/06 18:57:004/12/06 18:57:00 www.FreeLibros.me
Compartir