Как найти подстроку из строки "/user/desktop/abc/post/" с помощью C/С++? Я хочу проверить, присутствует ли папка "abc" или нет в этом пути.
Путь - это указатель на символ char *ptr = "/user/desktop/abc/post/";
Как найти подстроку из строки "/user/desktop/abc/post/" с помощью C/С++? Я хочу проверить, присутствует ли папка "abc" или нет в этом пути.
Путь - это указатель на символ char *ptr = "/user/desktop/abc/post/";
В C используйте стандартную библиотечную функцию strstr()
:
const char *str = "/user/desktop/abc/post/";
const int exists = strstr(str, "/abc/") != NULL;
Позаботьтесь о том, чтобы случайно не найти слишком короткую подстроку (это и есть начальная и конечная слэши).
Используйте std::string
и find
.
std::string str = "/user/desktop/abc/post/";
bool exists = str.find("/abc/") != std::string::npos;
Пример с помощью std::string
найти метод:
#include <iostream>
#include <string>
int main (){
std::string str ("There are two needles in this haystack with needles.");
std::string str2 ("needle");
size_t found = str.find(str2);
if(found!=std::string::npos){
std::cout << "first 'needle' found at: " << found << '\n';
}
return 0;
}
Результат:
first 'needle' found at: 14.
Как указал пользователь1511510, существует необычный случай, когда abc находится в конце имени файла. Нам нужно искать либо /abc/
, либо /abc
, за которым следует строковый ограничитель '\0'
. Наивный способ сделать это - проверить, являются ли подстроки /abc/
или /abc\0
:
#include <stdio.h>
#include <string.h>
int main() {
const char *str = "/user/desktop/abc";
const int exists = strstr(str, "/abc/") || strstr(str, "/abc\0");
printf("%d\n",exists);
return 0;
}
но exists
будет равно 1, даже если abc не следует нулевым терминатором. Это связано с тем, что строковый литерал "/abc\0"
эквивалентен "/abc"
. Лучшим подходом является проверка того, является ли /abc
подстрокой, а затем увидеть, является ли символ после этой подстроки (индексированный с помощью указателя, возвращаемого strstr()
), либо /
, либо '\0'
:
#include <stdio.h>
#include <string.h>
int main() {
const char *str = "/user/desktop/abc", *substr;
const int exists = (substr = strstr(str, "/abc")) && (substr[4] == '\0' || substr[4] == '/');
printf("%d\n",exists);
return 0;
}
Это должно работать во всех случаях.
Используйте strstr(const char *s , const char *t)
и include<string.h>
Вы можете написать свою собственную функцию, которая ведет себя так же, как strstr
, и вы можете изменить в соответствии с вашим требованием также
char * str_str(const char *s, const char *t)
{
int i, j, k;
for (i = 0; s[i] != '\0'; i++)
{
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++);
if (k > 0 && t[k] == '\0')
return (&s[i]);
}
return NULL;
}
Если вы слишком много используете массивы, вы должны включить cstring.h
, потому что у него слишком много функций, включая поиск подстрок.