strpos в C- как это работает - PullRequest
12 голосов
/ 19 января 2010

Я действительно новичок в C.

Я хочу использовать функцию strpos, но она говорит мне, что ее не существует?

Ответы [ 5 ]

22 голосов
/ 05 октября 2011

Вот полный фрагмент кода, чтобы решить вашу проблему. PS : еще не поздно помочь. ;)

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

#define NOT_FOUND -1

int main (){
    int pos = NOT_FOUND;
    if ( (pos = strpos( "subsstring", "string")) != NOT_FOUND )
        printf("found at %d\n", pos);
    else
        printf("not found!\n");
    return 0;
}

int strpos(char *haystack, char *needle)
{
   char *p = strstr(haystack, needle);
   if (p)
      return p - haystack;
   return NOT_FOUND;
}

Редактировать : Ответ на вопрос Vural Can:

Нет. Я действительно думаю, что все будет так, как есть. В парадигме структурированного программирования общепринятой практикой является использование структуры области видимости в качестве первого параметра для каждой функции, которая принадлежит самой области структуры. Функция strstr, определенная в string.h, использует тот же подход.

На ООП у вас есть haystack.indexOf( needle ). При структурном программировании у вас есть indexOf( haystack, needle ).

14 голосов
/ 19 января 2010

Функция, которую вы ищете, может быть либо strstr, либо strchr.Затем вам нужно включить string.h.В интерфейсе POSIX нет strpos.

3 голосов
/ 19 января 2010

Да. Он называется strstr, относится к strpos подобно (псевдокод):

strpos(str, target) {
   res = strstr(str, target); 
   if (res == NULL) return false;
   else             return res - str;
}
1 голос
/ 07 января 2017

Я написал функцию strpos () с нуля с возможностью позиционирования (как в PHP-функции strpos ()) Возвращаемым значением будет начальная позиция искомой строки. Наслаждайтесь! :)

В этом примере выходной код будет 12

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

int strpos(char *haystack, char *needle, int pos);

int main(){

    printf("%d",strpos("abcdefabcdefabcdef asdfgavcabcddd","abc",10));

    return 0;
}

int strpos(char *haystack, char *needle, int pos){
    int i,j,check,result = -1;
    int len_needle=strlen(needle);
    int len_haystack=strlen(haystack);  
    i = pos;
    if (len_needle>len_haystack || *needle==NULL || i>(len_haystack-1)) return result;

    for(;i<len_haystack;i++){
        check = 0;
        for(j=0;j<len_needle;j++){
            if(haystack[i+j]==needle[j]){
                check++;
            }
        }           
        if(check==len_needle){
            result = i;
            break;
        }

    }
    return result;
}
0 голосов
/ 07 марта 2018

Это в ответ на Miere и Can Vural. Я пока не могу добавлять комментарии, поэтому добавлю это как ответ.

Разве это не должно быть strpos ("string", "substring") - Can Vural

При структурном программировании у вас есть indexOf (стог сена, игла). Miere

В вашем коде у вас есть:

int strpos(char *haystack, char *needle)

но у вас также есть:

(pos = strpos( "subsstring", "string")) 

Я полностью согласен с «int strpos (char * haystack, char * needle)», где строка для поиска идет первой, а строка для поиска FOR - второй. Но для меня, «подстрока» (в контексте «один является подстрокой, а другой - строкой»), «подстрока» подразумевает, что ИТ короче из двух, и вы пытаетесь найти «подстроку» в строка. "

Итак, одна часть:

(pos = strpos( "subsstring", "string")) 

должно быть:

(pos = strpos( "string" /*that which is being searched within/*, "substring" /*that which is being searched for in the previous parameter*/)) 

, который будет таким же, как:

(pos = strpos( "haystack", "needle")) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...