Теоретически обе строки должны иметь завершающий нулевой символ в конце ('\0
), потому что в противном случае функция не знает, когда прекратить чтение строки:
Возьмите функцию strlen
. Он считывает длину строки до нулевого символа и может быть реализован следующим образом:
size_t strlen(const char* str)
{
size_t len = 0;
for(; *str; ++str, ++len);
return (len);
}
Обратите внимание, что условие — *str
, что также может означать *str != 0
, что показывает, что цикл for увеличивает строку и длину до тех пор, пока не будет найден нулевой символ.
Однако, если нулевой терминатор не указан (например, вы выделили char[5]
для "Hello"
, хотя на самом деле это должно быть char[6]
- "Hello\0"
), это чистая удача, если используемая вами функция останавливается в конце «привет».
Чтобы сделать это проще, если вы пишете массив символов, вы можете вместо этого не включать число в фигурные скобки и позволить компилятору вывести его для вас, чтобы убедиться, что есть нулевой завершающий символ:
const char haystack[] = "IDontUnderstand?Help!";
const char needle[] = "?";
Обратите внимание, что вы не можете поставить const char haystack[strlen("IDontUnderstand?Help!") + 1] = "IDontUnderstand?Help!";
, так как strlen("IDontUnderstand?Help!") + 1
не является постоянным значением.
Однако, если вы хотите динамически выделять память, вы можете использовать strlen
, чтобы помочь:
char* get_str_buffer(const char* value)
{
char* buf = malloc(strlen(value) + 1);
strcpy(buf, value);
return (buf);
}
int main(void)
{
const char *haystack = get_str_buffer("IDontUnderstand?Help!");
const char *needle = get_str_buffer("?");
char *buffer;
buffer = strstr(haystack, needle);
printf("The substring is: %s\n", buffer);
free(haystack);
free(needle);
return(0);
}
person
Joe
schedule
26.08.2015
'\0'
, иначе конец не идентифицируется. - person Jason   schedule 26.08.2015const char* needle = "?";
. Задача решена. - person Karoly Horvath   schedule 26.08.2015const char haystack[21] = "IDontUnderstand?Help!";
можно написатьconst char haystack[] = "IDontUnderstand?Help!";
. В последнем случае размер, необходимый для массива, рассчитывается компилятором. - person Jabberwocky   schedule 26.08.2015strchr()
. - person user12205   schedule 26.08.2015