#c #substring #c-strings #function-definition
#c #подстрока #c-строки #функция-определение
Вопрос:
char* string = "Hello, what's up?";
и я хочу просто вернуть
"at's up?"
Комментарии:
1.
amp;string[9]
«вернет» это.2. также нет библиотечной функции, которая это делает…
string 9
работает3. если это в цикле for, могу ли я выполнить amp;str1[i] ?
4. Конечно. Почему в цикле должно быть по-другому?
Ответ №1:
Вы можете написать функцию. Если функция не должна использовать стандартные строковые функции C, она может выглядеть, например, следующим образом
char * substr( char *s, size_t pos )
{
size_t i = 0;
while ( i < pos amp;amp; s[i] ) i;
return s i;
}
Поскольку C не поддерживает перегрузку функций, то приведенная выше функция также может быть записана как
char * substr( const char *s, size_t pos )
{
size_t i = 0;
while ( i < pos amp;amp; s[i] ) i;
return ( char * )( s i );
}
Вот демонстрационная программа.
#include <stdio.h>
char * substr( const char *s, size_t pos )
{
size_t i = 0;
while ( i < pos amp;amp; s[i] ) i;
return ( char * )( s i );
}
int main(void)
{
char * s = "Hello, what's up?";
puts( substr( s, 9 ) );
return 0;
}
Вывод программы
at's up?
Комментарии:
1. Что случилось со всеми этими ненужными пробелами?
2. @MarcoBonelli Что вы имеете в виду?
3. Я имею в виду
( char * )( s i )
вместо(char *)(s i)
илиputs( substr( s, 9 ) )
вместо простоputs(substr(s, 9))
и т. Д. Кажется странным.4. @MarcoBonelli Нет, это выглядит очень хорошо и читаемо.
Ответ №2:
Если вы уже знаете длину строки (и, следовательно, знаете, что, продвигаясь n
на символы вперед, вы не пройдете дальше конца), вы можете использовать string n
или amp;string[n]
, которые являются эквивалентными способами «пропуска» первых n
символов строки.
#include <stdio.h>
int main(void) {
char *str = "Hello!";
printf("%sn", str 1); // ello!
printf("%sn", str 3); // lo!
char *str2 = str 3;
printf("%sn", str2); // lo!
}
С другой стороны, если вы не знаете длину строки, вам нужно будет убедиться, что вы не пройдете дальше конца, сначала используя цикл. Вы можете написать функцию для этого:
#include <stdio.h>
char *skip(char *s, size_t n) {
while (*s amp;amp; n--)
s ;
return s;
}
int main(void) {
char *str = "Hello!";
printf("%sn", skip(str, 1)); // ello!
printf("%sn", skip(str, 3)); // lo!
printf("%sn", skip(str, 100)); // empty line
char *str2 = skip(str, 3);
printf("%sn", str2); // lo!
}