Ok, antes de siquiera hacer mi pregunta, quiero dejar una cosa clara. Actualmente soy estudiante de NIU en Informática y esto se relaciona con una de mis tareas para una clase allí. Entonces, si alguien tiene un problema, no siga leyendo y continúe con su negocio.Limpiar una cadena de puntuación en C++
Ahora para cualquier persona que esté dispuesta a ayudar, aquí está la situación. Para mi tarea actual, tenemos que leer un archivo que es solo un bloque de texto. Para cada palabra en el archivo, debemos borrar cualquier puntuación en la palabra (por ejemplo, "can not" podría terminar como "can" y "that - to" terminaría como "that" obviamente sin las comillas, las citas se usaron solo para especificar el ejemplo).
El problema que me he encontrado es que puedo limpiar bien la cadena y luego insertarla en el mapa que estamos usando, pero por alguna razón el código que he escrito permite insertar una cadena vacía en el mapa. Ahora he intentado todo lo que puedo pensar para evitar que esto suceda y lo único que se me ocurre es utilizar el método de borrado dentro de la propia estructura del mapa.
Así que lo que estoy buscando son dos cosas, cualquier sugerencia sobre cómo podría a) arreglar esto sin simplemente borrarlo yb) cualquier mejora que pueda hacer en el código que ya he escrito.
Aquí están las funciones que he escrito para leer desde el archivo y luego la que lo limpia.
Nota: la función que lee desde el archivo llama a la función clean_entry para eliminar la puntuación antes de insertar algo en el mapa.
Editar: Gracias Chris. Los números están permitidos :). Si alguien tiene alguna mejora en el código que he escrito o cualquier crítica de algo que hice, lo escucharé. En la escuela, realmente no recibimos retroalimentación sobre la forma correcta, adecuada o más eficiente de hacer las cosas.
int get_words(map<string, int>& mapz)
{
int cnt = 0; //set out counter to zero
map<string, int>::const_iterator mapzIter;
ifstream input; //declare instream
input.open("prog2.d"); //open instream
assert(input); //assure it is open
string s; //temp strings to read into
string not_s;
input >> s;
while(!input.eof()) //read in until EOF
{
not_s = "";
clean_entry(s, not_s);
if((int)not_s.length() == 0)
{
input >> s;
clean_entry(s, not_s);
}
mapz[not_s]++; //increment occurence
input >>s;
}
input.close(); //close instream
for(mapzIter = mapz.begin(); mapzIter != mapz.end(); mapzIter++)
cnt = cnt + mapzIter->second;
return cnt; //return number of words in instream
}
void clean_entry(const string& non_clean, string& clean)
{
int i, j, begin, end;
for(i = 0; isalnum(non_clean[i]) == 0 && non_clean[i] != '\0'; i++);
begin = i;
if(begin ==(int)non_clean.length())
return;
for(j = begin; isalnum(non_clean[j]) != 0 && non_clean[j] != '\0'; j++);
end = j;
clean = non_clean.substr(begin, (end-begin));
for(i = 0; i < (int)clean.size(); i++)
clean[i] = tolower(clean[i]);
}
Regístrese para la divulgación completa –
Lo mismo aquí. También aprecio que Brandon obviamente puso mucho esfuerzo en su trabajo antes de hacer la pregunta. –
No tengo ningún problema con que alguien pida ayuda para una tarea cuando primero han intentado completarla. Son las personas perezosas las que nos piden que hagamos todo su trabajo por ellos que me molesta. –