Проблема с управлением arrays в C ++

Как дела. Я начинаюсь в c ++ с программой, чтобы экспортировать данные в формате библиографической встречи:

using namespace std;

int main()
{
    setlocale(LC_CTYPE,"Spanish");
    char autor[40], anio_public[4], nombre_articulo[60], nombre_pagina[30], texto en negritafecha_consulta[30], url[100];
    stringstream cadena;
    cout<<"Autor:\n"<<endl;
    cin.getline(autor,40);
    system("cls");
    cout<<"Año de publicación:\n"<<endl;
    cin.getline(anio_public,4);
    system("cls");
    cout<<"Nombre del artículo:\n"<<endl;
    cin.getline(nombre_articulo,60);
    system("cls");
    cout<<"Nombre de página consultada:\n"<<endl;
    cin.getline(nombre_pagina,30);
    system("cls");
    cout<<"Fecha de consulta:\n"<<endl;
    cin.getline(fecha_consulta,30);
    system("cls");
    cout<<"Link:\n"<<endl;
    cin.getline(url,100);
    system("cls");
    cadena<<autor<<". ("<<anio_public<<"). "<<nombre_articulo<<". "<<nombre_pagina<<". [Internet], ("<<fecha_consulta<<"), [Disponible en]: "<<url<<endl;
    cout<<"\nBibliografía:\n\n"<<endl<<cadena.str();
    return 0;
}

Проблема приходит, попросив "Год публикации", так как я считаю очевидным array anio_public[4] но только он позволяет мне вводить 3 символа в компьютер, чтобы продолжать функционировать правильно; в момент ввождения 4 необходимых символов в компьютер, игнорируются все остальные инструкции ввода данных и меня приносят в конце программы показывая только "Автор" и первые 3 вошедших символа "Года публикации".

Цепь с 3 вошедшими символами:

autor= Autor 1  
anio_public= 123    //3 caracteres  
nombre_articulo= articulo 1  
nombre_pagina= pagina 1  
fecha_consulta= fecha/consulta 1  
url= url de consulta  

Автор 1. (123). статья 1. страница 1. [Интернет], (дата / консультация 1), [Доступный в]: url консультации

Цепь с 4 вошедшими символами:

autor= Autor 1  
anio_public= 1234    //4 caracteres
/*
nombre_articulo= articulo 1  
nombre_pagina= pagina 1  
fecha_consulta= fecha/consulta 1        *todo esto ya no lo toma en cuenta
url= url de consulta
*/

Автор 1. (123)... [Интернет], (), [Доступный в]:

Уже я попробовал меняя размер размер array, менять тип информации в string или int, передвигать линию в конце концов, но он продолжает давать мне проблемы. Какая-то подсказка?

1
задан 04.11.2019, 06:06
1 ответ

Привет don_caverna я надеюсь помочь тебе. Изюм, который, когда программа ждет разгрузку символов, которые ты даешь ему из-за клавиатуры в консоли и количестве символов, больше, чем та предела, что ты дал array anio_public 4 символов, перемещает следующее:

EJEMPLO:\Изюм, который ты вводишь в компьютер 2018, но когда ты даешь в enter, ты вводишь характер в компьютер '\n', чтобы прыгать от линии, у тебя есть 5 символов вместо 4, которые ты распределил, эта оставшаяся часть остается в буфере, так как они не могут сохраняться в anio_public.

Решение этой проблемы состоит в том, чтобы отлаживать эту разгрузку всякий раз когда ввело в компьютер большее количество символов, что та, которая далеко array, но aveces это не происходит, тогда я рекомендую тебе использовать fgets вместо cin для разгрузку символов, так как эта функция, если он осторожен не оставления в буфере символов, которые могут потом затрагивать функционирование твоей программы.

#include<iostream>
#include<string>
#include<sstream>
#include<stdio.h>

using namespace std;

void limpiarBuffer();

int main() {
    setlocale(LC_CTYPE,"Spanish");
    char autor[40], anio_public[4], nombre_articulo[60], nombre_pagina[30], fecha_consulta[30], url[100];
    stringstream cadena;
    cout<<"Autor:\n"<<endl;
    fgets(autor, 40, stdin);

    system("cls");
    cout<<"Año de publicación:\n"<<endl;
    fgets(anio_public, 4, stdin);

    system("cls");
    cout<<"Nombre del artículo:\n"<<endl;
    fgets(nombre_articulo, 60, stdin);

    system("cls");
    cout<<"Nombre de página consultada:\n"<<endl;
    fgets(nombre_pagina, 30, stdin);

    system("cls");
    cout<<"Fecha de consulta:\n"<<endl;
    cin.getline(fecha_consulta,30);

    system("cls");
    cout<<"Link:\n"<<endl;
    fgets(url, 100, stdin);
    system("cls");

    // al poner todos los arrays de caracteres seguidos tiende a fallar
    // al separarlos se desaparece el problema
    cadena<<autor;
    cadena<<". (";
    cadena<<anio_public;
    cadena<<"). ";
    cadena<<nombre_articulo;
    cadena<<". ";
    cadena<<nombre_pagina;
    cadena<<". [Internet], (";
    cadena<<fecha_consulta;
    cadena<<"), [Disponible en]: ";
    cadena<<url<<endl;

    cout<<"\nBibliografía:\n\n"<<endl;
    string info = cadena.str();
    cout<<info;
    return 0;
}

void limpiarBuffer() {
    while(getchar()!='\n');
}

Даже asÃ, - оставил тебе эту линию кода, который помогал достаточно тебе в функции limpiarBuffer, который ждет характер до тех пор, пока он не найдет разрыв линии или enter или '\n', чтобы отлаживать ввод и оставаться с правильной разгрузкой программы.

, Так что используя fgets header stdio.h ты решаешь твою проблему, надеялся помочь тебе, если ты sirvià ты не забыл расставить знаки препинания во мне!

-1
ответ дан 10.11.2019, 22:45
  • 1
    перемешивать cin с stdin не хорошая идея, так как если не está n синхронизировавшие (для этого он существует std::ios_base::sync_with_stdio) оно не будет функционировать как ожидание – eferion 03.11.2019, 22:56

Теги

Похожие вопросы