(c ++) проблема в печати слов строки массива char - PullRequest
0 голосов
/ 02 марта 2019

Я делаю программу на С ++, используя строку (тип данных) и массив символов.Теперь тип данных печатает слова в порядке.Но у меня возникли проблемы с массивом символов.Вот код:

#include<iostream>
#include<string.h>
using namespace std;
int main(){
    char str[200]; 
    string str1;
    cout<<"Enter a string:\t";
    getline(cin,str1);
    cout<<str1 <<endl;
    cout<<"enter second string:\t";
    cin>>str;
    cin.get(str,200);
    cout<<str;

}

вывод кода

Как видно из вывода, строка типа данных печатает слова нормально.Но в массиве char отсутствует первое слово.Я делаю что-то неправильно?или массив char работает по-другому?Пожалуйста, объясни.Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Хотя вы уже обнаружили, что cin >> str; не требуется, поскольку вы просто снова пишете в str с помощью cin.getline (str, sizeof str), существует ряд дополнительных проблем, на которые следует обратить внимание:

1. Если ваш компилятор не древний, вам следует #include <string>, а не C-заголовок string.h;

2. Не использовать magic-цифры в вашем коде.Если вам нужна константа, например, для максимального числа символов в str, #define константа или используйте глобальный enum, чтобы сделать то же самое, например,

#define MAXC 200    /* if you need a constant, #define one (or more) */
...
    char str[MAXC]; /* don't use 'magic-number', use a constant */

Таким образом, когда иесли в будущем вы измените количество символов в str, вам не придется выбирать весь ваш код и менять каждое вхождение magic-number , например, cin.get(str,200);.

3. Проверка КАЖДОГО пользовательского ввода.В противном случае неудачный ввод может установить бит ошибки в вашем входном потоке, а дополнительные попытки чтения из потока с установленным битом ошибки могут привести к неопределенному поведению.Вы можете сделать:

    if (!getline(cin,str1)) {   /* VALIDATE every input */
        cerr << "error: input failure - str1.\n";
        return 1;
    }

и

    if (cin.get (str, sizeof str))
        cout << str << endl;

( примечание: больше нет попыток чтения после cin.get (str, sizeof str), поэтому вы защитите использование strдостаточно)

4. Всегда выводите символ новой строки после вывода последней строки, чтобы убедиться, что ваша программа POSIX-совместима.В противном случае во многих операционных системах вы запутаете запрос пользователя при записи в stdout или создадите выходной файл, не совместимый с POSIX, если перенаправите вывод в файл, например,

my cat has none01:22 wizard:~/dev/src-cpp/tmp/debug>

Поместите его в целом,Вы можете сделать что-то вроде:

#include <iostream>
#include <string>   /* depending on your compiler */

#define MAXC 200    /* if you need a constant, #define one (or more) */

using namespace std;

int main (void) {

    char str[MAXC]; /* don't use 'magic-number', use a constant */
    string str1;

    cout << "enter a string: ";
    if (!getline(cin,str1)) {   /* VALIDATE every input */
        cerr << "error: input failure - str1.\n";
        return 1;
    }
    cout << str1 << endl;

    cout << "enter second string: ";
    // cin >> str;  /* not needed */
    if (cin.get (str, sizeof str))
        cout << str << endl;

}

Пример использования / Вывод

$ ./bin/cin.get_getline
enter a string: my dog has fleas
my dog has fleas
enter second string: my cat has none
my cat has none
0 голосов
/ 02 марта 2019
cout<<"enter second string:\t";
cin>>str;
cin.get(str,200);

здесь сначала вы пытаетесь прочитать второе слово дважды в одну и ту же переменную.Прокомментируйте один из них и попробуйте напечатать содержимое стр.

#include<iostream>
#include<string.h>
using namespace std;
int main(){
    char str[200]; 
    string str1;
    cout<<"Enter a string:\t";
    getline(cin,str1);
    cout<<str1 <<endl;
    cout<<"enter second string:\t";
    // cin>>str;
    cin.get(str,200);
    cout<<str<<endl;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...