Эффективный способ найти и скопировать подстроку в C - PullRequest
0 голосов
/ 10 октября 2018

Я просто хочу найти специальную подстроку в другой строке и сохранить ее как другую строку.Вот код:

char sub[13]={};
char *ptr = sub;
char src[100] = "SOME DATE HERE CBC: 2345,23, SOME OTHER DATA";
//                              |----------|
ptr = strstr(src,"CBC:");
strncpy(sub,ptr,sizeof(sub)-1);

Это эффективный способ или существует лучший метод для этого?Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Если этот фрагмент кода не находится на критическом пути и , это фактический источник узкого места в производительности, тогда просто придерживайтесь того, что у вас есть.Реализация по умолчанию strstr должна быть вполне адекватной задаче.

Вы можете сжать некоторые арахисы, предварительно вычислив, например, конец src, чтобы вы могли использовать memcmp (безусловный цикл) вместо strncpy (который имеет условный цикл) при извлечении sub.Если вы заранее знаете подстроку, которую ищете, вы также можете оптимизировать ее;особенно если это ровно 4 символа.И так далее, и так далее.

Но если вы являетесь после этих арахисов, вам может быть (намного) лучше, переделав код, чтобы не извлекать sub для начала и использоватьчто-то вроде строк ранжирования, чтобы отслеживать, где оно находится в исходной строке.

0 голосов
/ 10 октября 2018

Это эффективный способ или существует лучший метод для этого?

Плюсы:

Использует strstr(), что вероятноболее эффективен и корректен, чем кодирование вашего собственного поиска.

Минусы:

Не обрабатывает случай, когда strstr() возвращает NULL, что приводит к неопределенному поведению (UB). @ Пол Огилви

ptr = strstr(src,"CBC:");
// add test
if (ptr) {
  // copy
} else {
  // Handle not found, perhaps `sub[0] = '\0';`
}

char sub[13]={}; не соответствует C-коду. @ PMG .Полная инициализация массива не требуется - хотя это и является общепринятой практикой.

Код не совсем выполняет «хочу найти специальную подстроку в другой строке и сохранить ее как другую строку».Это больше похоже на «хочу найти специальную подстроку в другой строке и сохранить ее и более как другую строку».

strncpy(sub,ptr,sizeof(sub)-1) может излишне заполнять массив нулевыми символами.Это неэффективно, когда ptr указывает на строку, намного меньшую, чем sizeof(sub).Код может использовать strncat(), но это сложно.Смотрите этот хороший ответ @AnT.

// alternative
char src[100] = "SOME DATE HERE CBC: 2345,23, SOME OTHER DATA";

char sub[13];
sub[0] = '\0';

const char *ptr = strstr(src, "CBC:");
if (ptr) {
  strncat(sub, p, sizeof sub - 1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...