Зацикливание Const Char

Мне нужно зациклить const char, и я использовал простой пример строкового цикла:

const char *str;
for(int i = 0; i < 10; ++i)
{
   str += " ";
}

Но когда я попытался скомпилировать, то получил следующее:

ubuntu @ eeepc: ~ / Test_C_OS $ gcc -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
kernel.c: 26: error: начальное объявление цикла 'for' используется вне режима C99
kernel.c: 28: ошибка: недопустимые операнды для двоичного кода +
ubuntu @ eeepc: ~ / Test_C_OS $

Что я должен делать?


person Nathan Campos    schedule 20.01.2010    source источник
comment
Вы спросили об этом для развлечения или действительно хотите получить серьезный ответ? Ваш профиль выглядит так, будто вам не нужно задавать такой вопрос.   -  person x4u    schedule 20.01.2010
comment
В профиле указано, что он новичок в C ++.   -  person Jacob    schedule 20.01.2010
comment
Этот код лежит в основе вашей новой операционной системы?   -  person    schedule 20.01.2010
comment
Натан - странная помесь наифа и тролля. Его вопросы здесь могут доставить часы невинного веселья, если не будут приняты слишком (а лучше вообще) серьезно.   -  person    schedule 20.01.2010


Ответы (6)


Ваша первая ошибка связана с тем, что вы сделали:

for (int i = 0; ...

вместо:

int i;
for (i = 0; ...)

(в качестве альтернативы вы можете оставить этот бит в покое и добавить -std=gnu99 в параметры gcc).

Ваша вторая ошибка связана с тем, что строка:

   str += " ";

пытается добавить два значения указателя. Это не имеет определенной семантики в C - в этом нет никакого смысла. Даже не совсем понятно, что вы пытаетесь здесь сделать - возможно, вы хотите начать с пустой строки, а затем добавить к ней 10 копий строки " "? Если да, то вам нужно изменить его на что-то вроде:

char str[100]; /* Allocate space for a 99 character string, plus terminator */
int i;

str[0] = '\0'; /* Start with empty string */
for (i = 0; i < 10; i++)
{
    strcat(str, " ");
}

Однако в этом конкретном случае, поскольку вы всегда выполняете цикл 10 раз, вам вообще не нужен цикл - вы можете просто использовать строку из 10 пробелов:

char str[100];

strcpy(str, "          "); /* 10 spaces */

(str[0] = '\0'; не нужен, потому что теперь мы используем strcpy, а не strcat).

person caf    schedule 20.01.2010
comment
Натан Кампос: Я откатил ваше редактирование, потому что отредактированная версия не оставила место назначения в виде допустимой строки. - person caf; 21.01.2010

C89 не поддерживает объявление счетчика циклов в первой части for выражение. C99 работает, но большинству компиляторов требуется явная опция (-std=c99 для gcc), чтобы включить ее. Делать:

int i;
for ( i = 0; i < 10 ; ++i ) ...

А также не добавляйте символы в указатели на символы :)

person Nikolai Fetissov    schedule 20.01.2010
comment
Он пытается ДОБАВИТЬ строку к указателю на строку. Это не будет объединять - это добавит фактическое значение указателя на " " к значению указателя str. Это тоже верно, поскольку const char* является изменяемым указателем на const char - я думаю, что он имеет в виду использовать char const str[11] - person BlueRaja - Danny Pflughoeft; 20.01.2010
comment
Недопустимо добавлять один указатель к другому - арифметика указателей определяется таким образом, что pointer + integer = pointer и pointer - pointer = integer. - person caf; 21.01.2010

У вас здесь две проблемы

1) Стандарт C89 не позволяет объявлениям находиться внутри цикла

for(int i = 0; i < 10; ++i)

должно быть:

int i
for(i = 0; i < 10; ++i)

2) Вы пытаетесь добавить два значения указателя:

str += " ";

Что здесь нужно сделать, зависит от того, что именно вы пытаетесь сделать со строкой str.

person Alan H    schedule 20.01.2010
comment
Пункт 2 неверен. У этого кода есть проблема, но он не меняет константу. Пожалуйста, проверьте свое понимание указателей. - person asveikau; 20.01.2010
comment
C99 позволяет объявлять int в цикле for, вы, вероятно, имеете в виду C89 в пункте 1. - person Dan Olson; 21.01.2010
comment
да. Исправлено и это. Спасибо. - person Alan H; 21.01.2010

Показанный вами код не делает ничего значимого. Вы можете попробовать сделать следующее:

Мое первое предположение состоит в том, что вы пытаетесь создать строку, состоящую из 10 пробелов. Для этого:

char str[10];
int i;
for (i = 0; i < 10; i++)
{
  str[i] = ' ';
}

Второе, что вы, возможно, пытаетесь сделать, - это изменить место, куда указывает ваш char *. Поскольку вы объявили его как const, это не сработает, как указывали другие. Но это то, что пытается сделать ваш код, поэтому он терпит неудачу. Если вы на самом деле пытаетесь увеличить точку, на которую указывает точка (на значение ASCII-значения пробела), то вам нужно сделать указатель непостоянным.

РЕДАКТИРОВАТЬ: хороший улов. должны быть одинарными кавычками.

Что касается того, что это не строка, поскольку она не заканчивается нулем, я пытался как можно точнее предсказать, что OP пытался сделать. Прерывание нулем потребовалось бы, если бы его можно было рассматривать как истинную строку, но я оставил это, поскольку OP тоже.

person David Oneill    schedule 20.01.2010
comment
Строка str[i] = " "; по-прежнему неверна - возможно, вы имели в виду str[i] = ' ';? Значит, вы все еще не создали строку, поскольку нет нулевого терминатора (и нет места для него). - person caf; 20.01.2010

Есть несколько ошибок в вашем коде.

Во-первых, вы пытаетесь построить строку, используя указатель char, который ни на что не указывает. Либо используйте массив chars, либо выделите память с помощью malloc. Затем вы объявляете int i внутри цикла for. Это не будет компилироваться на большинстве компиляторов. Вам нужно объявить i, прежде чем использовать его в цикле for. Вы также можете скомпилировать его с помощью gcc, используя gcc --std=c99 test.c. После этого вы пытаетесь объединить строки с помощью оператора +. Помните, что C не имеет встроенного строкового типа и поэтому не определяет оператор + для конкатенации строк (char* или char[] не являются строками так же, как строковые классы в C ++ и Java, они просто используются как строки ). Для этого вам следует использовать функцию concat из string.h. На самом деле, многократно вызывать concat для добавления одного char в конец строки - не лучшая идея, но это уже другая история, и давайте просто пересечем этот мост, когда доберемся туда :).

Было бы неплохо прочитать главу об указателях и строках в любой хорошей книге по Си. Эти вещи работают немного иначе, чем вы, вероятно, думаете.

person MAK    schedule 20.01.2010

Если вы хотите выполнить цикл / итерацию своего const char * str, сделайте следующее:

const char *str;
for (int i = 0; i < sizeof(str); i++)
{
   doSomethingWith(str[i]);
}
person LenArt    schedule 05.08.2014
comment
помните, что const char *array из строк может заканчиваться символом NUL для завершения строки '\0', поэтому ваш размер может быть на 1 больше, чем количество читаемых символов. en.wikipedia.org/wiki/Ascii#ASCII_control_code_chart - person LenArt; 06.08.2014