2016-04-04 19 views
0

Ich möchte scannen, um Zeichenketten getrennt durch eine / mit sscanf zu trennen, aber es funktioniert nicht. Es funktioniert gut mit einem Raum.Wie scannen Sie zwei Strings mit `/` mit Hilfe von sscanf?

Zum Beispiel möchte ich die Zeichenfolge 50%/60% in zwei Strings wie 50% und 60% trennen.

Sie können einen Blick auf Code haben here:

#include <iostream> 
using namespace std; 

int extract_break_rewrites(int *m, int *n, const char *arg) 
{ 
    char m_str[10]; 
    char n_str[10]; 
    int err; 

    int count = sscanf(arg, "%s %s", n_str, m_str); 
    printf("%s %s %d\n",n_str, m_str,count); 
    if (count == 0) { 
     count = sscanf(arg, "/%s", m_str); 
     if (count == 0) { 
      *m = 0; 
      *n = 0; 
      return -1; 
     } 
     if (sscanf(m_str, "%d%%", m) != 1) 
      return -1; 
    } 
    else if (count == 1) { 
     if (sscanf(n_str, "%d%%", n) != 1) 
      return -1; 
    } 
    else if (count==2) { 
     if (sscanf(n_str, "%d%%", n) != 1) 
      return -1; 
     if (sscanf(m_str, "%d%%", m) != 1) 
      return -1; 
    } 
    return 1; 
} 

int main() { 
    int n,m; 
    const char * command = "50% 60%"; 
    if (extract_break_rewrites(&m,&n,command)!=-1) 
     cout<<"Successful. The values of m and n are "<<m<<" and "<<n<<", respectively.\n"; 
    else 
     cout<<"There was error in processing, may be input was not in the correct format.\n"; 
    return 0; 
} 

Sie brauchen keine Sorgen zu machen, was der Code tut, sind die wichtigen Linien 10, 11 und Hauptfunktion.

+1

Bitte senden Sie den Code hier statt einen Link zu dem Code. –

+0

Dies wird ein x-y-Problem genannt. Sie wollen eine Zeichenkette analysieren und denken, 'sscanf' ist das richtige Werkzeug. Es ist nicht. – stark

+1

Ihr Code ist in C++ geschrieben, Sie sollten Ihr Tag in C++ ändern. Wenn Sie jedoch Strings parsen wollen, können Sie strtok verwenden, um die Zeichenfolge in Token zu unterteilen. – DMH

Antwort

3

Versuchen Sie, die folgenden (unter der Annahme von stdin):

scanf("%[^/]/%s"); 

Verwenden sscanf(buf, ...); wenn von einem Puffer zu lesen. Das Problem besteht darin, dass %s für scanf davon ausgeht, dass auf die Zeichenfolge ein Leerzeichen folgt. Dieser Ansatz weist scanf an, einen durch / abgegrenzten String zu finden und den Rest dann als separaten String abzustimmen.

EDIT: fiel aus Versehen die / in dem Scan-String

+0

Wie scannt das zwei Saiten? –

+0

@SaurabhJain: Der vollständige Code sollte 'if (sscanf (arg,"% 9 [^ /] /% 9s ", n_str, m_str) == 2) {... OK ...} else {... Mit Fehlern umgehen}} . Die "9" ist die Menge an Speicherplatz in den String-Variablen mit Ausnahme der abschließenden Null. –

1

Verwenden Sie set ein Scan

char a[100]; 
char b[100]; 
scanf("%[^/]/%s", a, b); 

Dies alles durchsucht, bis es eine / bekommt, dann geht es los und liest in einem String.

0

Sie auch std::string s und ihre Einrichtungen zu erreichen, um das gleiche Ergebnis verwenden können:

#include <iostream> 
#include <string> 

using std::string; 
using std::cout; 
using std::stoi; 

bool extract_break_rewrites(int &m, int &n, const string &arg) { 
    // find position of %/ in the string 
    string::size_type pos_first = arg.find("%/"); 
    // check if the return value is valid (the substring is present and there 
    // is something else first) 
    if (pos_first == string::npos || !pos_first) // wrong input 
     return false; 

    string::size_type pos_2 = pos_first + 2, 
         pos_last = arg.find("%", pos_2); 
    if (pos_last == string::npos || pos_last == pos_2) 
     return false; 

    try { 
     m = stoi(arg.substr(0, pos_first)); 
     n = stoi(arg.substr(pos_2, pos_last - pos_2)); 
    } 
    // invalid argument or out of range 
    catch (...) { 
     return false; 
    } 

    return true; 
} 

int main() { 
    int n = 0, m = 0; 
    string command = "150%/60%"; 

    if (extract_break_rewrites(m, n, command)) 
     cout << "Successful. The values of m and n are " 
      << m << " and " << n << ", respectively.\n"; 
    else 
     cout << "There was error in processing, " 
      << "maybe input was not in the correct format.\n"; 

    return 0; 
} 
+0

Danke, aber schon behoben, es sieht auch etwas lang aus. –