2016-04-24 16 views
4

Wenn ich eine Zeichenfolge wie die Zeichenfolge, die den BefehlWie Teilzeichenfolge zwischen Anführungszeichen in C finden

ist

echo ‚foobar‘ | cat

Gibt es für mich eine gute Möglichkeit, um den Text zwischen den Anführungszeichen ("foobar") zu bekommen? Ich habe gelesen, dass es möglich ist, scanf zu verwenden, um es in einer Datei zu tun, ist es auch möglich, in-memory?

Mein Versuch:

char * concat2 = concat(cmd, token); 
    printf("concat:%s\n", concat2); 
    int res = scanf(in, " '%[^']'", concat2); 
    printf("result:%s\n", in); 
+1

http://www.cplusplus.com/reference/cstdio/sscanf/ –

+0

@ Ich bin froh, dass Sie die Frage verstanden haben. Ich entschied mich für 'sscanf'. –

Antwort

3

Wenn die Zeichenfolge in diesem Format ist - "echo 'foobar'|cat", sscanf genutzt- sein kann

char a[20]={0}; 
char *s="echo 'foobar'|cat"; 
if(sscanf(s,"%*[^']'%[^']'",a)==1){ 
    // do something with a 
} 
else{ 
// handle this condition 
} 

%*[^'] wird eine Zeichenfolge lesen und verwerfen, bis es trifft auf ein einzelnes Zitat ', der zweite Formatbezeichner %[^'] wird Zeichenfolge bis ' lesen und speichern es in a.

+1

Schöne Antwort! Allerdings wird 'a' nicht auf NULL gesetzt, wenn es nicht gefunden wird oder so. Wie wäre es mit 'char a [20] = {0};'? :) Außerdem, in dem Fall, dass es finden wird, was wir suchen, kümmert sich 'sscanf() um das' \ 0'? – gsamaras

+1

@gsamaras Initialisierung wäre gut und auch die Überprüfung von 'scanf' sollte getan werden. – ameyCU

+2

Genau! Deine Antwort ist eleganter, aber ich werde meine als Alternative behalten. +1. – gsamaras

4

Verwenden strtok() einmal, das erste Auftreten von Trennzeichen Sie wünschen (' in Ihrem Fall), und dann noch einmal zu finden, die Endung Paar zu finden, wie folgt aus:

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    const char* lineConst = "echo 'foobar'|cat"; // the "input string" 
    char line[256]; // where we will put a copy of the input 
    char *subString; // the "result" 

    strcpy(line, lineConst); 

    subString = strtok(line, "'"); // find the first double quote 
    subString=strtok(NULL, "'"); // find the second double quote 

    if(!subString) 
    printf("Not found\n"); 
    else 
    printf("the thing in between quotes is '%s'\n", subString); 
    return 0; 
} 

Ausgang:

das Ding in Anführungszeichen ist 'foobar'


Ich war auf dieser Basis: How to extract a substring from a string in C?

+0

Wäre eine Bewertung wert, wenn keine überflüssigen "\" - Zeichen sowohl in die ursprüngliche Zeichenfolge als auch in die strtok-Suchmarker eingefügt würden. Sie tun nichts, um das Problem zu lösen und es nur zu verwirren, behaupte ich. Wenn die ursprüngliche Zeichenfolge "echo" foobar "| cat" war, stimme ich in einer Sekunde zu. Aber es ist nicht. Es gibt nichts, was zu entkommen wäre. Ich bin eigentlich eher neugierig auf Ihre Motivation, sie in diesem Fall hinzuzufügen. – enhzflep

+1

@enhzflep danke dafür, ich verbesserte meine Antwort, ist es jetzt besser? :) Ich testete zuerst mit doppelten Anführungszeichen (die das Entkommen erfordern) und plante, das Entkommen für die einfachen Anführungszeichen zu entfernen, aber dann kam die Antwort von ameyCU und Ich bin damit aufgewachsen. – gsamaras

+0

Gern geschehen. _I_ denke, es ist, ich bin aber nur ein Mann. Sie haben bereits meine Stimme dafür bekommen. (Witze ->) Ich habe irgendwo eine Trophäe, die sagt "leicht abgelenkt", ich werde jedes Mal, wenn ich danach suche, auf die Seite gestellt ..: lacht: – enhzflep

0

Es gibt eine Vielzahl von Möglichkeiten, das Problem anzugehen. Gehen Sie mit einem Zeigerpaar durch die Zeichenfolge, um die Begrenzer zu finden, und stellen Sie eine große Anzahl von Zeichenfolgenfunktionen bereit, die in string.h bereitgestellt werden. Sie können wie strpbrk Verwendung von Zeichen Suchfunktionen wie strchr oder String-Suchfunktionen machen, Sie Tokenisieren Funktionen wie strtok verwenden können, etc ...

Schauen Sie vorbei und lernen von ihnen allen. Hier ist eine Implementierung mit strpbrk und eine Zeigerdifferenz. Es ist nicht destruktiv, Sie müssen also keine Kopie der ursprünglichen Zeichenfolge erstellen.

#include <stdio.h> 
#include <string.h> 

int main (void) { 

    const char *line = "'foobar'|cat"; 
    const char *delim = "'";  /* delimiter, single quote */ 
    char *p, *ep; 

    if (!(p = strpbrk (line, delim))) { /* find the first quote */ 
     fprintf (stderr, "error: delimiter not found.\n"); 
     return 1; 
    } 
    p++;      /* advance to next char */ 
    ep = strpbrk (p, delim); /* set end pointer to next delim */ 

    if (!p) { /* validate end pointer */ 
     fprintf (stderr, "error: matching delimiters not found.\n"); 
     return 1; 
    } 

    char substr[ep - p + 1];  /* storage for substring */ 
    strncpy (substr, p, ep - p); /* copy the substring */ 
    substr[ep - p] = 0;    /* nul-terminate */ 

    printf ("\n single-quoted string : %s\n\n", substr); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/substr 

single-quoted string : foobar 

Ohne string.h Mit

Wie oben erwähnt, können Sie auch einfach zu Fuß ein Paar Zeiger auf der Zeichenfolge und lokalisieren Sie Ihre Paare von Anführungszeichen auf diese Weise.Der Vollständigkeit halber ist hier ein Beispiel mehrere Strings in Anführungszeichen innerhalb einer einzigen Zeile zu finden:

#include <stdio.h> 

int main (void) { 

    const char *line = "'foobar'|cat'mousebar'sum"; 
    char delim = '\''; 
    char *p = (char *)line, *sp = NULL, *ep = NULL; 
    size_t i = 0; 

    for (; *p; p++) {    /* for each char in line */ 
     if (!sp && *p == delim)    /* find 1st delim */ 
      sp = p, sp++;     /* set start ptr */ 
     else if (!ep && *p == delim)  /* find 2nd delim */ 
      ep = p;       /* set end ptr */ 
     if (sp && ep) {      /* if both set */ 
      char substr[ep - sp + 1];  /* declare substr */ 
      for (i = 0, p = sp; p < ep; p++)/* copy to substr */ 
       substr[i++] = *p; 
      substr[ep - sp] = 0;   /* nul-terminate */ 

      printf ("single-quoted string : %s\n", substr); 
      sp = ep = NULL; 
     } 
    } 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/substrp 
single-quoted string : foobar 
single-quoted string : mousebar 

Schauen Sie alle Antworten auf und lassen Sie uns wissen, wenn Sie Fragen haben, .

Verwandte Themen