LINUX.ORG.RU

Найти позицию первого несовпадения двух строк

 


0

2

Надо найти общую подстроку в некотором множестве строк. Подстрока всегда в начале строк. Произвольного доступа к разным строкам нет, строки лежат в списке. Дополнительной памяти под строки нет, только место для результата.

Это как-то делается с помощью str* функций из libc или надо вручную?

Спасибо.

★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Такое сойдёт? (Quick'n'dirty решение)

#include <stdio.h>

char *strings[] = {
	"abcd",
	"qwerty",
	"xyz",
	"abcdef",
	"whatever",
	NULL,
};

int
common(char *a, char *b)
{
	int n = 0;

	while (*a++ == *b++)
		n++;

	return n;
}

int
main()
{
	char **s, **p;
	char *a = NULL, *b = NULL;
	int n = 0;

	for (s = strings; *s; s++) {
		for (p = s+1; *p; p++) {
			int c = common(*s, *p);
			if (c > n) {
				n = c;
				a = *s;
				b = *p;
			}
		}
	}

	if (a && b)
		printf("most common: %s %s\n", a, b);

	return 0;
}
most common: abcd abcdef

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Такое я тоже могу, вопрос в том, есть ли полезные в этой задаче str* функции. А то я уже написал несколько своих strcmp для разных случаев и мне это не нравится.

amaora ★★
() автор топика

какой то язык, угловые отрефайнишь сам.

если тебе общую для всего списка то


r=0
while(1){
  curch=listofstrings[0][r]
  if(!curch)return r; 
  for s in listofstrings:
     if(s[r]!=curch)"
         return r

 r=r+1;
}    
qulinxao ★★☆
()
Ответ на: комментарий от amaora

идём по всему списку и помним(как угодно указателями али ещё индексом)минимальную и максимальную строки

общий префикс минимальной и максимальной строки есть префикс всего списка строк :)

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 2)
Ответ на: комментарий от amaora
$man str\Tab\Tab
strace       strdup       strings      strncpy      strspn       strtonum
strcasecmp   strdupa      stringsize   strndup      strstr       strtoq
strcasestr   stream       strip        strndupa     strtod       strtoul
strcat       stream.im6   strlcat      strnlen      strtof       strtoull
strchr       strerror     strlcpy      strnstr      strtoimax    strtoumax
strchrnul    strerror_r   strlen       strpbrk      strtok       strtouq
strcmp       strfmon      strmode      strptime     strtok_r     strverscmp
strcoll      strfry       strncasecmp  strrchr      strtol       strxfrm
strcpy       strftime     strncat      strsep       strtold      
strcspn      string       strncmp      strsignal    strtoll 

в чём затруднение?

qulinxao ★★☆
()

Тебе подстрока известна? Если да,то strstr(3).

kirk_johnson ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.