`strlen()` в указателях на строки

Любая идея для получения длины строки объявленной с использованием метода char*?

(Как вы знаете, char* объявляет указатель, указывающий на первый элемент строки, поэтому strlen() бесполезен.)

найдите код ниже.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lib/tinyexpr.h"

void cexpGen();

char *c_exp = "1";
char expressions[2] = {'+', '-'};
int now = 0;

int main()
{
    cexpGen();
    printf("%s", c_exp);
    return 0;
}

void cexpGen()
{
    for (; now < 3; now++)
    {
        if (now == 0)
        {
            c_exp[strlen(c_exp)] = expressions[0];
            c_exp[strlen(c_exp)] = '\0';

            c_exp[strlen(c_exp)] = ((c_exp[strlen(c_exp) - 2]) + 1);
            c_exp[strlen(c_exp)] = '\0';

            now++;

            if (c_exp[(strlen(c_exp) - 1)] == '9')
            {
                if (te_interp(c_exp, 0) == 100)
                {
                    int i = 1;
                    printf("%c   %s\n", i, c_exp);
                    i++;
                }

                continue;
            }

            char *c_exptmp = c_exp;

            cexpGen();

            c_exp = c_exptmp;
        }

        if (now == 1)
        {
            c_exp[strlen(c_exp)] = expressions[1];
            c_exp[strlen(c_exp)] = '\0';

            c_exp[strlen(c_exp)] = ((c_exp[strlen(c_exp) - 2]) + 1);
            c_exp[strlen(c_exp)] = '\0';

            now++;

            if (c_exp[(strlen(c_exp) - 1)] == '9')
            {
                if (te_interp(c_exp, 0) == 100)
                {
                    int i = 1;
                    printf("%c   %s", i, c_exp);
                    i++;
                }
            }

            char *c_exptmp = c_exp;

            cexpGen();

            c_exp = c_exptmp;
        }

        if (now == 2)
        {
            c_exp[strlen(c_exp)] = ((c_exp[strlen(c_exp) - 1]) + 1);
            c_exp[strlen(c_exp)] = '\0';

            if (c_exp[(strlen(c_exp) - 1)] == '9')
            {
                if (te_interp(c_exp, 0) == 100)
                {
                    int i = 1;
                    printf("%c   %s\n", i, c_exp);
                    i++;
                }
            }

            char *c_exptmp = c_exp;

            cexpGen();

            c_exp = c_exptmp;
        }
    }
}

Затем компилятор gcc выдает ошибку сегментации в 'c_exp[strlen(c_exp)] = expressions[0];' линия.

1 ответ

Любая идея для получения длины строки объявленной с использованием метода char*?

Да, это довольно прямо

char* p = "Some text";
size_t len = strlen(p);

Проблема с вашим кодом в других местах.

Пример:

c_exp[strlen(c_exp)] = expressions[0];

Здесь вы пытаетесь изменить символ в строке, которая c_exp указывает на. поскольку c_exp указывает на строковый литерал, который является недопустимым. Чтобы сделать это законным, вы должны были сделать:

char c_exp[] = "1";

вместо использования указателя. Тем не менее, даже в этом случае это будет довольно странно, поскольку вы перезаписываете завершение строки с помощью expressions[0]т.е. c_exp больше не будет строкой. Итак, когда вы делаете:

c_exp[strlen(c_exp)] = '\0';
      ^^^^^^^^^^^^^

Вы снова делаете что-то незаконное, используя strlen на что-то, что не является строкой.

Кстати: этот код

c_exp[strlen(c_exp)] = '\0';

действительно ничего не делает! Если c_exp это строка, элемент по индексу strlen(c_exp) уже имеет значение '\0' таким образом, назначение ничего не меняет вообще.

Другие вопросы по тегам