Зацикливание Const Char - PullRequest
       55

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

0 голосов
/ 20 января 2010

Мне нужно зациклить 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: ошибка: первоначальное объявление цикла «for», используемое вне режима C99
kernel.c: 28: ошибка: недопустимые операнды в двоичный файл +
убунту @ EeePC: ~ / Test_C_OS $

Что мне делать?

Ответы [ 6 ]

5 голосов
/ 20 января 2010

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

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).

4 голосов
/ 20 января 2010

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

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

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

2 голосов
/ 20 января 2010

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

1) Стандарт C89 не допускает, чтобы объявления были внутри цикла

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

должно быть:

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

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

str += " ";

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

1 голос
/ 20 января 2010

Код, который вы показали, не делает ничего значимого. Есть пара вещей, которые вы, возможно, пытаетесь сделать:

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

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

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

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

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

0 голосов
/ 05 августа 2014

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

const char *str;
for (int i = 0; i < sizeof(str); i++)
{
   doSomethingWith(str[i]);
}
0 голосов
/ 20 января 2010

Есть несколько вещей, которые не так с вашим кодом.

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

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

...