C ++ cin va boshqalar C. sscanf

Shunday qilib, men buni Cda yozgan edim, shuning uchun sscanf sani tekshiradi, lekin keyin uni yo'qotadi, keyin d-ni ko'rib chiqadi va uni saqlaydi. Ya'ni "Salom 007" bo'lsa, "Salom" taranadi, ammo tashlanadi va 007 dda saqlanadi.

static void cmd_test(const char *s)
{
    int d = maxdepth;
    sscanf(s, "%*s%d", &d);
}

Xo'sh, mening savolim qanday qilib men bir narsani qilishim mumkin, lekin C ++ da? ehtimol, stringstreamdan foydalansangiz?

3

3 javoblar

#include 
#include 

static void cmd_test(const char *s)
{
    std::istringstream iss(s);
    std::string dummy;
    int d = maxdepth;
    iss >> dummy >> d;
}
5
qo'shib qo'ydi

Siz anonim tarzda mag'lubiyatga aylanolmaysiz, lekin siz faqat qo'g'irchoqni yasashingiz va uni e'tiborsiz qoldirishingiz mumkin:

#include 
#include 
// #include //see below

void cmd_test(std::istream & iss)//any std::istream will do!
{

 //alternatively, pass a `const char * str` as the argument,
 //change the above header inclusion, and declare:
 //std::istringstream iss(str);

  int d;
  std::string s;

  if (!(iss >> s >> d)) { /* maybe handle error */ }

 //now `d` holds your value if the above succeeded
}

Esingizda bo'lsin, ekstraksiya shartli bo'lgan joydan olib tashlanishi mumkin emas. Agar xatolik yuz bergan bo'lsa, siz nima qilasiz; C ++ ishi istisno (agar amaldagi xatoliklar allaqachon xatolikka sabab bo'lsa-da, faqat return xato bo'lishi mumkin).

Misoldan foydalanish:

#include 
#include 

int main()
{
  cmd_test(std::cin);

  std::ifstream infile("myfile.txt");
  cmd_test(infile);

  std::string s = get_string_from_user();
  std::istringstream iss(s);
  cmd_test(iss);
}
3
qo'shib qo'ydi
@ChristianRau: Kim biladi ... OP o'ralgan magistrallarga oid ishda ko'rinadi, ehtimol, u erda bironta joyda yotgan oqim bor. Agar siz xohlamasangiz const char * dan birini yaratishingiz mumkin. Men izoh qo'shdim.
qo'shib qo'ydi muallif Kerrek SB, manba
@ChristianRau: Yaxshi fikr, men uni o'zgartirdim!
qo'shib qo'ydi muallif Kerrek SB, manba
Ehtimol, argumentni const char * dan istringstream ga o'zgartirish biroz og'irmi?
qo'shib qo'ydi muallif Christian Rau, manba
@KerrekSB Yaxshi nuqta, amalda men oqim dalillarini ham afzal ko'rardim. Ammo bu holatda umumiy istim yanada yaxshi bo'lar edi.
qo'shib qo'ydi muallif Christian Rau, manba
@KerrekSB Ammo endi o'zgarish juda og'ir. Hech bo'lmasa, u faqat char * yoki mag'lubiyatga ega bo'lganida bu funksiyani qanday qilib chaqirish mumkinligini misol ko'rsatib berishi mumkin (va ehtimol, nomni istimga almashtirish mumkin).
qo'shib qo'ydi muallif Christian Rau, manba
Xatolarni ko'rib chiqish haqida eslab qolish uchun +1.
qo'shib qo'ydi muallif ildjarn, manba

Nima haqida:

#include 
#include 

static void cmd_test(const std::string &s)
{
    int d = maxdepth;
    std::string dont_care;
    std::istringstream in(s);
    in >> dont_care >> d;
}
1
qo'shib qo'ydi