Betterthanyou написав:▼Прихований текст
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
using namespace std;
int main()
{
char str[100];
int i, k, lineint;
string line;
cin >> line;
if (sscanf(line.c_str(), "%d%s", &k, &str) != 1/*перевірка на вміст символів у рядку*/) { cout << "Error\n"; }
else
{
lineint = atoi(line.c_str());/*переведення у число*/
for (i = 0; i<lineint; i++) { cout << i/*відображення скільки повідомлень*/ << " hello world\n"; }
}
system("pause");
return 0;
}
отут є чудовий приклад роботи sscanf http://www.c-cpp.ru/content/sscanf
Дійсно, не до кінця зрозумів з нею, тепер проблема з "12abrakadabra" немає, але я почав відлагоджувати програму і побачив ще один баг, коли є пробіли в строці, програма просто не реагує.
Itari написав:▼Прихований текст
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
using namespace std;
int main()
{
int i,k,lineint;
string line;
int b=0
do{
cin>>line;
size_t e;
try{
i=stoi(s,&e);
for(;i>0;i--)cout<<"Hello word ";
b=1;
} catch(invalid_argument& ia) {
cout<<"Що це за непотріб? Вводь ще раз."<<endl;
}
}while(!b)
system("pause");
return 0;
}
Підійде?
Дивно, чомусь в мене компілятор майже на все жаліється, навіть з виправленими помилками у коді, але я й досі не зрозумів логіки вашого коду, вибачайте якщо щось не так, просто я ще практикуюсь у вивчені С++.
-=ЮрА=- написав:▼Прихований текст
Ostapchuk, навіщо після сканфу ще раз конвертувати рядок? Ти робиш роботу по конвертації 2 рази(такий підхід дуже нераціональний - уяви якщо таких перетворень потрібно кілка мільйонів, тоді ти зробиш на один зайвий мільйон дій більше), це можно зроботи дуже просто, якщо перевіряти наступний за числом символ, якщо він \0 чи знак табуляції (пробіл \t \r та інші то рядок дійсно має число у конкретній позиції)
#include <ctype.h>//isspace
#include <string>
#include <iostream>
using namespace std;
int main(){
string lines[] = {
"12abrakadabra",
"25",
"2a"};
size_t elem = 0;
int value= 0;
char delim= 0;
for( elem = 0; elem < 3; elem++ )
{
if( !sscanf(lines[elem].c_str(), "%d%c", &(value = 0), &(delim = 0)) )
cout<<"sscanf error"<<endl;
else
if( delim ? isspace(delim) : true )
cout<<"value : "<<value<<endl;
else
cout<<"string is not contain pure number"<<endl;
}
return 0;
}
http://codepad.org/EteHPDpg
string is not contain pure number
value : 25
string is not contain pure number
Погодся це набагато зручніше та коротше за довжиною.
Та ж сама ситуація як з попереднім прикладом, щоб краще роз'яснити проблему, я прикріпив скріншот