реализация strspn () - PullRequest
2 голосов
/ 02 мая 2009

Определение библиотечной функции strspn:

size_t strspn(const char *str, const char *chars)

/*Return number of leading characters at the beginning of the string str which are all members of string chars.*/

например. если «str» - «fecxdy», а «chars» - «abcdef», то функция возвращает 3, поскольку «f», «e» и «c» все появляются где-то в «chars», давая 3 ведущих символа «str» ', а' x '- это первый символ' str ', который не является членом' chars '.

Может ли кто-нибудь помочь мне написать реализацию strspn на "C". Единственная библиотечная функция, которую мне разрешено вызывать из реализации, это strlen.

Ответы [ 6 ]

6 голосов
/ 02 мая 2009

Основная идея состоит в том, чтобы пройти по строке, по одному символу за раз, и проверить, находится ли она в наборе символов. Если это не так, остановитесь и верните ответ. В псевдокоде это будет выглядеть так:

count = 0
for each character c in str
    if c is not in chars
        break
    count++
return count

Тест if c is not in chars может быть реализован путем итерации всех символов chars и проверки соответствия c любому из символов. Обратите внимание, что это не самая быстрая реализация, поскольку она включает в себя пошаговое выполнение строки chars для каждого символа в str. Более быстрая реализация будет использовать справочную таблицу для проверки, если c is not in chars.

2 голосов
/ 22 марта 2013

Я думаю, что это должно быть довольно быстро

size_t strspn(const char *str, const char *chars){
    unsigned char ta[32]={0};
    unsigned i,cnt=0;
    for(i=0;chars[i];++i)
        ta[chars[i]>>3]|=0x1<<(chars[i]%8);
    for(i=0;str[i];++i)
        if((ta[str[i]]>>(str[i]%8))&0x1) break;
    return cnt-1;
}
1 голос
/ 26 января 2011
int my_strspn(const char *str1,const char *str2){
int i,k,counter=0;
for(i=0;str1[i]!='\0';i++){
 if(counter != i) break;
 for(k=0;str1[k]!='\0';k++){
  if(str1[i]==str2[k])
   counter++;
 }
}
 return counter;
}
1 голос
/ 13 января 2011

Я нашел этот вопрос при прохождении старых экзаменов. Вам не разрешалось использовать индексирование или какие-либо стандартные функции. Вот моя попытка найти решение:

#include <stdio.h>    
size_t myStrspn(const char *str1, const char *str2){
  size_t i,j;
  i=0;

  while(*(str1+i)){
    j=0;
    while(*(str2+j)){
      if(*(str1+i) == *(str2+j)){
        break; //Found a match.
      }
      j++;
    }
    if(!*(str2+j)){
      return i; //No match found.
    }
    i++;
  }
  return i;
}

void main(){
  char s[] = "7803 Elm St.";
  int n = 0;
  n = myStrspn(s,"1234567890");
  printf("The number length is %d. \n",n);
}

Вот решение с экзамена:

#include<stdio.h>
size_t strspn(const char* cs, const char* ct) {
  size_t n;
  const char* p;
  for(n=0; *cs; cs++, n++) {
    for(p=ct; *p && *p != *cs; p++)
      ;
    if (!*p)
      break;
  }
  return n;
}

Для петель сделал его намного более компактным.

0 голосов
/ 05 июля 2015

Хорошо, реализуя стандартную библиотеку для моей ОС, вот мое решение (C ++).

KCSTDLIB_API_FUNC(size_t DECL_CALL strspn(const char * str1, const char * str2))
{
size_t count = 0;
auto isin = [&](char c)
{
    for (size_t x = 0; str2[x]; x++)
    {
        if (c == str2[x])
            return true;
    };
    return false;
};
for (; isin(str1[count]); count++);
return count;
}
0 голосов
/ 02 мая 2009

Не прикасаясь к C-компилятору за последние пару лет. С макушки головы что-то вроде этого должно работать:

int spn = 0;
while(*str++ != '\0')
{
  char *hay = chars;
  bool match = false;
  while(*hay++ != '\0')
  {
     if(*hay == *str)
     {
       match = true;
       break;
     }
  }

  if(match)
     spn++;
  else
     return spn;
}
return spn;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...