#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.