2012-08-06 4 views
7

Hier zu finden ist ein Programm, eine akzeptieren:In C Position der Teilkette in einem String

  1. Satz von einem Benutzer.
  2. Wort von einem Benutzer.

Wie finde ich die Position des im Satz eingegebenen Wortes?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
    char sntnc[50], word[50], *ptr[50]; 
    int pos; 
    puts("\nEnter a sentence"); 
    gets(sntnc); 
    fflush(stdin); 
    puts("\nEnter a word"); 
    gets(word); 
    fflush(stdin); 
    ptr=strstr(sntnc,word); 

    //how do I find out at what position the word occurs in the sentence? 

    //Following is the required output 
    printf("The word starts at position #%d", pos); 
    return 0; 
} 
+1

Sie 2 Zeiger subtrahieren kann (bis 'char') und das Ergebnis als Integer interpretiert:' Position = ptr - sntnc; ' – pmg

+6

** NICHT VERWENDEN 'gets()'! NICHT 'fflush()' INPUT STREAMS! ** – pmg

+0

in Java/JavaScript haben wir genau diese Funktion, die Sie brauchen: indexOf. Jedoch eine schnelle Suche ermöglichte mir, einen Thread zu finden, der bespricht, was Sie benötigen: eine indexOf like Funktion in C, überprüfen Sie bitte diesen Pfosten: http://stackoverflow.com/questions/4824/string-indexof-function-in-c – gaspyr

Antwort

15

Der ptr Zeiger wird an den Anfang des word, zeigen, so dass Sie nur die Position des Satzes Zeiger subtrahieren, sntnc, von ihm:

pos = ptr - sntnc; 
+0

schlag mich, dang: P –

+9

... aber nur wenn 'ptr' nicht' NULL' ist. – caf

4

Die Rückkehr von strstr() ist eine Zeiger auf das erste Auftreten des „Wort“, so

pos=ptr-sntc; 

Dies funktioniert nur, weil SNTC und ptr Zeiger auf die gleiche Zeichenfolge sind. Um zu verdeutlichen, wann ich das Vorkommen sage, ist es die Position des ersten übereinstimmenden Zeichens, wenn die übereinstimmende Zeichenkette in Ihrer Zielzeichenkette gefunden wird.

2

Just for reference:

char saux[] = "this is a string, try to search_this here"; 
int dlenstr = strlen(saux); 
if (dlenstr > 0) 
{ 
    char *pfound = strstr(saux, "search_this"); //pointer to the first character found 's' in the string saux 
    if (pfound != NULL) 
    { 
     int dposfound = int (pfound - saux); //saux is already pointing to the first string character 't'. 
    } 
} 
1

Aus irgendwelchen Gründen war ich Probleme mit strstr having(), und ich wollte auch Index.

Ich habe diese Funktion gemacht, um die Position der Teilzeichenfolge innerhalb einer größeren Zeichenfolge (falls vorhanden) zu finden, ansonsten gib -1 zurück.

int isSubstring(char * haystack, char * needle) { 
    int i = 0; 
    int d = 0; 
    if (strlen(haystack) >= strlen(needle)) { 
     for (i = strlen(haystack) - strlen(needle); i >= 0; i--) { 
      int found = 1; //assume we found (wanted to use boolean) 
      for (d = 0; d < strlen(needle); d++) { 
       if (haystack[i + d] != needle[d]) { 
        found = 0; 
        break; 
       } 
      } 
      if (found == 1) { 
       return i; 
      } 
     } 
     return -1; 
    } else { 
     //fprintf(stdout, "haystack smaller\n"); 
    } 
} 
0

Fragen und Kommentare an den Original-Beitrag zu diesem Thema: Diese Erklärung ist FALSCH:

char sntnc[50], word[50], *ptr[50]; 

Code C würde kompiliert nicht einmal: es wird auf dieser Linie scheitern:

ptr = strstr(sntnc,word); 

So sollte die Zeile geändert werden in:

char sntnc[50], word[50], *ptr; 

Und Sie brauchen MEMEORY nicht zugewiesen zu 'ptr string'. Sie brauchen nur einen Zeiger auf char.

0

können Sie diese einfache strpos verwenden Modifikation

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int strpos(char *haystack, char *needle, int offset); 
int main() 
{ 
    char *p = "Hello there all y'al, hope that you are all well"; 
    int pos = strpos(p, "all", 0); 
    printf("First all at : %d\n", pos); 
    pos = strpos(p, "all", 10); 
    printf("Second all at : %d\n", pos); 
} 


int strpos(char *hay, char *needle, int offset) 
{ 
    char haystack[strlen(hay)]; 
    strncpy(haystack, hay+offset, strlen(hay)-offset); 
    char *p = strstr(haystack, needle); 
    if (p) 
     return p - haystack+offset; 
    return -1; 
} 
Verwandte Themen