Какова область применения char * [] в C? - PullRequest
2 голосов
/ 16 сентября 2010

У меня есть код, который делает следующее:

while(some condition)
{
     char *line[WORDLEN];
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
     line[0] = '\0';
}

Однако, похоже, что строка [0] = '\ 0' не делает то, что, я надеюсь, будет. Я хочу вернуться через цикл и использовать строку, как будто она только что была объявлена. Цикл работает так, как требуется в первый раз, однако не может обрабатывать строку как новый символ * [] на последующих итерациях Есть идеи, почему?

Ответы [ 3 ]

6 голосов
/ 16 сентября 2010
char *line[WORDLEN];

- это массив символов указателей . Я думаю, что вы имели в виду:

char line[WORDLEN];

массив из одного символа. Я бы просто выбрал:

while(some condition)
{
     char line[WORDLEN];
     line[0] = '\0';
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
}

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

4 голосов
/ 16 сентября 2010

В вашем коде вам не нужен массив символьных указателей - вам нужен массив символов:

while (some condition)
{
     char line[WORDLEN];

Теперь каждый раз в цикле переменная строка имеет неопределенное содержание - теоретически. В частности, в первый раз он не имеет определенного значения. Итак, вы должны инициализировать его:

     char line[WORDLEN] = "";

или

     char line[WORDLEN];
     line[0] = '\0';

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

     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
     line[0] = '\0';

При инициализации в начале цикла это назначение в конце становится излишним.

}
1 голос
/ 16 сентября 2010

Вы переделываете строку каждый раз, когда делаете цикл.

РЕДАКТИРОВАТЬ: И вы делаете странные вещи с указателями.line - это массив указателей на символы в вашем объявлении!Попробуйте это:

char line[WORDLEN];
while(some condition)
{
     line[0] = '\0';
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);

}
...