c++ - programming - Bjarne Stroustrup Book-Vector and For loop-no funcionará
programming: principles and practice using c++ (2)
Tengo dificultades con un código en particular que estoy aprendiendo de "Principios de programación y práctica con C ++".
No puedo obtener una salida de un bucle referido a un vector. Estoy usando std_lib_facilities y stdafx porque el libro y MVS me lo dijeron.
#include "stdafx.h"
#include "../../std_lib_facilities.h"
int main()
{
vector<string>words;
for(string temp; cin>>temp; )
words.push_back(temp);
cout << "Number of words: " << words.size() << ''/n'';
}
Esto no producirá nada. Voy a obtener el mensaje, escriba algunas palabras, luego ingrese, luego nada.
Intenté algunas variaciones que obtuve aquí y de otros sitios web, como:
//here i tried the libraries the guy used in his code
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
cout << "Please enter a series of words followed by End-of-File: ";
vector<string> words;
string word;
string disliked = "Broccoli";
while (cin >> word)
words.push_back(word);
cout << "/nNumber of words: " << words.size() << endl;
// cycle through all strings in vector
for (int i = 0; i < words.size(); ++i)
{
if (words[i] != disliked)
cout << words[i] << endl;
else
cout << "BLEEP!/n";
}
return 0;
}
Aún nada.
Después de probar algunas cosas, por eliminación, estoy bastante seguro de que el problema es con la comunicación loop-to-vector, porque todo esto funciona bien:
int main()
{
vector<string>words = { "hi" };
words.push_back("hello");
cout << words[1] << "/n"; // this will print hello
for (int i = 0; i < words.size();++i) {
cout << words[i] << "/n"; // this will print out all elements
// inside vector words, ( hi, hello)
}
cout << words.size();// this will print out number 2
for (string temp; cin >> temp;) {
words.push_back(temp);
}
cout << words.size();// this won''t do anything after i type in some
// words; shouldn''t it increase the size of the
// vector?
}
Tampoco esto solo:
int main()
{
vector<string>words = { "hi" };
for (string temp; cin >> temp;) {
words.push_back(temp);
}
cout << words.size();
}
¿Qué me estoy perdiendo, por favor? Gracias de antemano.
En primer lugar, no es necesario usar std_lib_facilities.h
. Eso es algo que se usa en el libro para evitar que todos los ejemplos del libro incluyan regularmente un conjunto de encabezados estándar, o para corregir comportamientos no estándar entre los compiladores. También es un encabezado que using namespace std
. Encontrará numerosos ejemplos (tanto en SO como en Internet más amplio) explicando por qué es MUY mala práctica using namespace std
en un archivo de encabezado.
En segundo lugar, tampoco es necesario usar stdafx.h
. Eso es algo generado por Microsoft IDE, y proporciona un medio de acelerar la compilación en proyectos grandes, debido a cómo hace que el compilador trabaje con encabezados precompilados. Si solo espera usar compiladores de Microsoft, entonces siéntase libre de llenar sus botas y usar este. Sin embargo, no es C ++ estándar, puede (según IDE y configuración del proyecto) incluir encabezados específicos de Windows que no funcionarán con compiladores que no sean de Microsoft, y en los foros probablemente desalienta a las personas que usan otros compiladores para que lo ayuden, ya que tendrán una buena razón para suponer que su código usa extensiones específicas de Microsoft, lo que significa que probablemente no puedan ayudarlo.
La primera muestra de código se puede volver a escribir, en C ++ estándar (sin uso de ninguno de los encabezados arriba) como
#include <vector> // for std::vector
#include <string> // for std::string
#include <iostream> // std::cout and other I/O facilities
int main()
{
std::vector<std::string> words;
for(std::string temp; std::cin >> temp; )
words.push_back(temp);
std::cout << "Number of words: " << words.size() << ''/n'';
}
Antes de emocionarte, esto mostrará el mismo problema (aparentemente no está terminando). La razón es en realidad la condición de terminación del ciclo - std::cin >> temp
solo terminará el ciclo si el final del archivo o algún otro error se encuentra en la transmisión.
Entonces, si escribes
The cow jumped over the moon
std::cin
continuará esperando la entrada. En general, es necesario que el USUARIO active y finalice la condición del archivo. En Windows, esto requiere que el usuario ingrese CTRL-Z
en una línea vacía seguida de la tecla Intro.
Una alternativa sería tener algún texto acordado previamente que haga que el bucle salga, como
#include <vector> // for std::vector
#include <string> // for std::string
#include <iostream> // std::cout and other I/O facilities
int main()
{
std::vector<std::string> words;
for(std::string temp; std::cin >> temp && temp != "zzz"; )
words.push_back(temp);
std::cout << "Number of words: " << words.size() << ''/n'';
}
que hará que el programa salga cuando la entrada contenga la palabra zzz
. Por ejemplo
The cow jumped over the moon zzz
Hay otras técnicas, como leer un carácter a la vez, y detener cuando el usuario ingresa dos líneas nuevas consecutivas. Eso requiere que su código interprete cada carácter y decida qué constituye una palabra. Lo dejo como un ejercicio.
Tenga en cuenta que no hay medios en C ++ estándar para leer directamente las pulsaciones de teclas: los problemas anteriores están relacionados con el funcionamiento de las transmisiones estándar e interactúan con el sistema host.
El usuario también puede usar el programa "tal cual" colocando el mismo texto en un archivo real y (cuando se ejecuta el programa) redirigir la entrada para que su programa provenga de ese archivo. Por ejemplo, your_executable < filename
.
Ingrese las cadenas y cuando termine, presione Ctrl + Z (seguido de Intro ) si está en Windows o Ctrl + D si está en Linux. Cuando haces eso, cin>>temp;
condición dentro de su bucle for
evaluará a falso y su programa saldrá del bucle.