Нахождение начала строки в C - PullRequest
0 голосов
/ 04 апреля 2020

Чтобы решить вопрос, я ищу способ остановить al oop после того, как он достигнет начала строки, предполагая, что l oop начинается с конца и уменьшается, есть ли альтернативный способ сделать это без определения длины строки первым и уменьшения до нуля? Пожалуйста, имейте в виду, что единственные функции, которые я могу использовать, это mallo c, free и write.

Ответы [ 3 ]

4 голосов
/ 04 апреля 2020

Это невозможно, потому что в начале нет ничего особенного в содержимом строки. Строки C имеют «значение часового» в их end - '\0' - но первый символ и байт в памяти перед первым символом могут иметь любое значение.

1 голос
/ 04 апреля 2020

есть ли альтернативный способ сделать это, не находя сначала длину строки и уменьшая ее до нуля?

Видимо, вы уже знаете, где находится конец строки , Я полагаю, у вас должен быть указатель на символ-терминатор, так как вы думаете, что не знаете длину строки.

Если нахождение длины строки вообще допустимо, тогда вы должны уже знаю где и начало тоже. И если вы знаете, где находится начало, и знаете, где находится конец, то вы уже знаете длину: это end - beginning. Но вам не нужно держать отдельный счетчик для итерации в обратном направлении от конца строки к началу, предполагая, что вы знаете, где находятся и конец, и начало. Вместо этого вы можете просто использовать сравнение указателей. Например:

int count_a_backwards(const char *beginning, const char *end) {
    int count = 0;

    for (const char *c = end; c > beginning; ) {
        if (*--c == 'a') count += 1;
    }

    return count;
}

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

0 голосов
/ 04 апреля 2020

Пожалуйста, имейте в виду, что единственными функциями, которые я могу использовать, являются mallo c, free и write.

Если вы используете функцию malloc, то функция возвращает указатель на первый байт выделенной памяти. Таким образом, если выделенный массив будет содержать строку, то ее начало будет известно.

Задача состоит в том, чтобы найти конец строки.

Вы можете использовать либо стандартную C функцию strlen или напишите свой собственный l oop, который найдет конец сохраненной строки.

Так что, если у вас есть два указателя, один из которых указывает на начало строки, а второй - на конец той же строки, а затем пройти строку в обратном порядке - не тяжелая работа.

Обратите внимание на то, что если у вас есть массив символов, который содержит такую ​​строку

char s[] = "Hello";

, то выражения s, s + 1, s + 2 и т. Д. На всех точках указывают на строку соответственно "Hello", "ello", "llo" и т. д.

Вы можете найти начало строки, имеющей указатель на ее конец, при условии, что первый элемент массива содержит уникальный символ, который дозорная стоимость. Однако в целом это очень редкий случай.

Вот демонстрационная программа, которая показывает, как вы можете пройти строку в обратном порядке без использования стандартных C строковых функций, кроме функции, которая помещает строку в динамически распределяемый массив.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
    enum { N = 12 };

    char *s = malloc( N );

    strcpy( s, "Hello World" );

    puts( s );

    char *p = s;

    while ( *p ) ++p;

    while ( p != s ) putchar( *--p );
    putchar( '\n');

    free( s );

    return 0;
}

Выходные данные программы:

Hello World
dlroW olleH
...