Хотя вы уже обнаружили, что cin >> str;
не требуется, поскольку вы просто снова пишете в str
с помощью cin.getline (str, sizeof str)
, существует ряд дополнительных проблем, на которые следует обратить внимание:
] 1. [1 131] Если ваш компилятор не старый, вы должны #include <string>
, а не C-заголовок string.h
;
2. Не используйте магические числа в своем коде. Если вам нужна постоянная, например, для максимального количества символов в 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
в будущем, вам не придется выбирать весь ваш код и изменять каждое вхождение магического числа [ 1120], например cin.get(str,200);
.
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
Я не понимаю, почему у вас есть дополнительная сложность определения лямбды в первую очередь. Почему бы просто не сделать это:
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand<object>(CommandWithAParameter);
}
private void CommandWithAParameter(object state)
{
var str = state as string;
}
Вы передадите параметр в лямбде команде, как :
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter(param)
);
}
Я не могу заменить ссылку на имя метода для выражения lamda из-за ошибки компиляции. Очевидно, и это не удивительно, что ссылка на имя нестатического метода не может использоваться вместо лямбды. Я не воспринимаю это как «дополнительную сложность». Для меня имеет смысл постоянно передавать ламды.