Как «cin» может испортить цикл?

#c #dev-c

#c #dev-c

Вопрос:

Я написал программу, которая позволяет вставлять n имен, а затем выводить эти имена на экран. Когда я устанавливаю n в фиксированное значение, программа работает нормально. Однако, когда я добавляю команду cin cin>>n , кажется, что программа пропускает первый цикл. Я заметил, что всякий раз, когда я использую cin , возникает проблема. Я думаю, когда я нажимаю enter в команде cin, которая вводит, сообщите первому циклу, что n[0]='' (возможно). Можете ли вы, ребята, помочь мне исправить это. Извините за мой английский.

Вот код:

 #include <iostream>
#include <string.h>
using namespace std;

int main()
{int n;cin>>n;//the root of the problem(i think)
    char **p = new char *[n];
    for (int i = 0; i < n; i  )
    {
        *(p   i) = new char[255];
    } //make a 2 dimensional array of strings

    for (int i = 0; i < n; i  )
    {
        char n[255] = "";
        cout << "insert names no."<<i 1<<": ";
        gets(n); 
        strcpy(p[i], n);//insert the names into the array of strings
    }

    for (int i = 0; i < n; i  )
    {
        cout << p[i] << endl; //print the names
    }
}
  

Комментарии:

1. Использование cin для чтения int не использует отправленную вами новую строку, поэтому ее использует следующее чтение

2. Вы должны проверить значение n сразу после cin, чтобы убедиться, что это допустимое значение. Также проверьте, что cin >> n выполнен успешно,

3. Я могу простить ваш английский, но ваш C нуждается в улучшении 😉

4. получает «Самая последняя редакция стандарта C (2011) окончательно удалила эту функцию из своей спецификации. Функция устарела в C (начиная со стандарта 2011, который следует C99 TC3).»

5. char n Почему вы повторно используете n ?

Ответ №1:

Строка:

 cin >> n;
  

Прочитает все введенные вами цифры, но не следующий символ перевода строки. Этот единственный символ перевода строки будет затем получен вашим вызовом gets() . В конечном итоге это приведет к тому, что первое имя будет пустым.

Вы можете:

  • Либо используйте Ctrl D вместо Return в приглашении вашего терминала, чтобы отправить значение без отправки перевода строки
  • Или пропустите пробел, используя cin >> n >> ws . В этом случае вы также должны #include <iomanip> .

Кроме того, вам лучше не смешивать функции iostream и stdio, и вы должны использовать std::string вместо строк C.