Dev - C++ - Impimir cadena de texto con espacios.

 
Vista:

Impimir cadena de texto con espacios.

Publicado por Pablo (2 intervenciones) el 04/08/2016 20:20:56
Hey, hola, saludos ^^ Verán, intento hacer que me imprima el nombre entero de una persona, y lo hace, de ésta forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<windows.h>
#include<string>
 
using namespace std;
main(){
 
	char n=164, e=130;
	float pass, edad, tel;
	string id, name, sexo;
	string pac;
 
 
 
	printf("Nombre: ");
	getline(cin, pac);
	cout<<pac<<endl;
 
	return 0;
}

Y me va bien, escribo un nombre completo con espacios y me lo devuelve tal cual. Sin embargo, tengo que agregar arriba un Login muy simple, y me queda:

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
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<windows.h>
#include<string>
 
using namespace std;
main(){
 
	char n=164, e=130;
	float pass, edad, tel;
	string id, name, sexo;
	string pac;
 
	do{
		system("color A4");
		printf("\t\tIngrese el ID: ");
		cin>>id;
		printf("\t\tIngrese la contrase%ca: ",n);
		scanf("%f",&pass);
 
			if (pass!=1234)
			printf("\t\tcontrase%ca incorrecta, intenta de nuevo.\n",n);}
 
	while(pass!=1234);
 
	printf("Nombre: ");
	getline(cin, pac);
	cout<<pac<<endl;
 
	return 0;
}

No altero, no toco nada del código en la parte de ingresar un nombre entero con espacios, sin embargo ya no me da siquiera la posibilidad de escribir el nombre. ¿Qué tiene ese DoWhile que al ponerlo me quita la posibilidad de ingresar un nombre?
Muchas gracias :c
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Impimir cadena de texto con espacios.

Publicado por Thanatos (199 intervenciones) el 05/08/2016 07:43:31
Normalmente ese tipo de problemas se deben a que el buffer de lectura aún contiene algún carácter almacenado, como se explica en este sitio.

No estoy seguro en que lenguaje lo necesitas, porque tu programa tiene funciones de C y C++:

En 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
#include <stdio.h>   // printf(), scanf(), fgets()
#include <stdlib.h>  // system(),
 
void limpiarBuffer(void);  // prototipo de la función "limpiarBuffer()".
 
int main() {
    int pass;
    char id[10];
    char pac[30];
 
    do {
        (void) system("color A4");
        printf("\t\tIngrese el ID: ");
        scanf("%[^\n]%*c", id);  // (void) fgets (id, 10, stdin);
        printf("\t\tIngrese la contrase\244a: ");
        scanf("%d", &pass);
 
        if (pass != 1234) {
            printf("\n\t\tContrase\244a incorrecta, intenta de nuevo.\n");
        }
        limpiarBuffer();
    } while (pass != 1234);
 
    printf("Nombre: ");
    scanf("%[^\n]%*c", pac);  //(void) fgets (pac, 30, stdin);
    printf("%s\n", pac);
 
    return 0;
}
 
void limpiarBuffer() {
    int c;
    while((c = getchar()) != '\n' && c != EOF) {}
}


En 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
#include <iostream> // cout, cin
#include <string>   // string, getline()
#include <limits>   // numeric_limits
#include <cstdio>   // system()
 
using namespace std;
 
void limpiarBuffer(void);  // prototipo de la función "limpiarBuffer()".
 
int main() {
    int pass;
    string id;
    string pac;
 
    do {
        (void) system("color A4");
        cout << "\t\tIngrese el ID: ";
        (void) getline(cin, id);
        cout << "\t\tIngrese la contrase\244a: ";
        cin >> pass;
 
        if (pass != 1234) {
            cout << "\n\t\tContrase\244a incorrecta, intenta de nuevo.\n";
        }
        limpiarBuffer();
    } while (pass != 1234);
 
    cout << "Nombre: ";
    (void) getline(cin, pac);
    cout << pac << endl;
 
    return 0;
}
 
void limpiarBuffer() {
    (void) std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

Si prefieres utilizar fgets() en lugar de scanf para leer las cadenas en el primer código, puedes sustituir las líneas 14 y 25, por las sentencias que cada una tiene como comentario a su derecha.

Cambié el tipo de dato a int, para el password. Me parece que el tipo float tampoco es el mejor para la edad y el teléfono.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Impimir cadena de texto con espacios.

Publicado por Pablo (2 intervenciones) el 06/08/2016 17:26:19
Gracias lo intentaré ^^ Y sí, tiempo después me di cuenta que para la edad y el teléfono no queda xD Luego las tendré que imprimir y saldrán con decimales :s
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar