Есть ли какой-либо способ вернуть строку, начинающуюся с определенного индекса, без использования библиотечных функций

#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!
}