`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'
таким образом, назначение ничего не меняет вообще.