Насколько я понимаю вопрос, в частности может быть это может помочь нам написать нашу версию std::string
, речь идет о
- делать то, что делает
std::getline
из заголовка <string>
, чтобы увидеть, что это включает.
Это уже хорошо обсуждалось Бьерном Страуструпом в его статье Learning Standard C++ as a New Language, за исключением того, что Бьерн обсуждает ввод с помощью оператора >>
, который вводит только одно слово, разделенное пробелами.
Бьерн начинает с псевдокода для гипотетического студенческого упражнения:
напишите подсказку "Пожалуйста, введите свое имя"
прочитайте имя
напишите "Здравствуйте, ‹имя›"
Затем он представляет одно возможное решение C++:
#include<iostream> // get standard I/O facilities
#include<string> // get standard string facilities
int main()
{
using namespace std; // gain access to standard library
cout << "Please enter your first name:\n";
string name;
cin >> name;
cout << "Hello " << name << '\n';
}
И после некоторого обсуждения он представляет решение в стиле C, самодельную программу в стиле C, которая делает то же самое, что и решение в стиле C++:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
void quit() // write error message and quit
{
fprintf(stderr," memory exhausted\n") ;
exit(1) ;
}
int main()
{
int max = 20;
char* name = (char*) malloc(max) ; // allocate buffer
if (name == 0) quit();
printf("Please enter your first name:\n");
while (true) { // skip leading whitespace
int c = getchar();
if (c == EOF) break; // end of file
if (!isspace(c)) {
ungetc(c,stdin);
break;
}
}
int i = 0;
while (true) {
int c = getchar() ;
if (c == '\n' || c == EOF) { // at end; add terminating zero
name[i] = 0;
break;
}
name[i] = c;
if (i== max-1) { // buffer full
max = max+max;
name = (char*)realloc(name, max) ; // get a new and larger buffer
if (name == 0) quit() ;
}
i++;
}
printf("Hello %s\n",name);
free(name) ; // release memory
return 0;
}
Эти две программы не совсем эквивалентны: первая программа в стиле C++ считывает только одно слово ввода, а программа C пропускает пробелы, а затем считывает всю строку ввода. Но это иллюстрирует, что нужно для того, чтобы сделать это самостоятельно. Короче говоря, лучше используйте стиль C++. ;-)
person
Cheers and hth. - Alf
schedule
16.04.2015