C программирование печати массива символов - PullRequest
5 голосов
/ 23 октября 2011

У меня есть массив символов, объявленных как:

char *array[size];

Когда я выполняю

printf("%s", array);

, это дает мне некоторые символы мусора, почему это так?

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

Этот URL указывает, что printf принимает в формате: `int printf (const char * format, ...);

#include <stdio.h>
#include <string.h>
#define size 20
#define buff 100
char line[buff];

int main ()
{
    char *array[100];
    char *sep = " \t\n";

    fgets(line, buff, stdin);

    int i;

    array[0] = strtok(line, sep);

    for (i = 1; i < size; i++) {
        array[i] = strtok(NULL, sep);

        if (array[i] == NULL)
            break;
    }

    return 0;
}

Ответы [ 4 ]

6 голосов
/ 23 октября 2011

Вы объявляете массив символов следующим образом:

char foo[size];

Вы, кажется, перепутали его с char *, который является указателем на символ. Вы могли бы сказать

char *bar = foo;

, что указывает bar на содержимое foo. (Или, собственно, к первому символу foo.)

Чтобы затем распечатать содержимое массива, вы можете выполнить одно из следующих действий:

// either print directly from foo:
printf("%s", foo);
// or print through bar:
printf("%s", bar);

Обратите внимание, однако, что C не выполняет инициализацию содержимого переменных, поэтому, если вы специально не установите содержимое в что-либо, вы получите мусор. Кроме того, если этот мусор не содержит \0; то есть символ со значением 0 будет продолжать выводиться после конца массива.

4 голосов
/ 23 октября 2011

Почему мы делаем такую ​​простую вещь звучащей так сложно?

char array[SIZE];
... /* initialize array */
puts(array);   /* prints the string/char array and a new line */
/* OR */
printf("%s", array); /* prints the string as is, without a new line */

char in array после окончания того, что вы хотите стать вашимстрока (т. е. если вы хотите, чтобы ваша строка читала «Hello», которая будет следующим символом после 'o'), должна быть завершающим символом NUL '\ 0'.Если вы используете функцию C для чтения ввода, который будет автоматически добавлен в конец вашего буфера.Вам нужно будет беспокоиться о том, чтобы сделать это вручную, если по какой-то причине вы по отдельности записываете символы в буфер или что-то еще.

РЕДАКТИРОВАТЬ: Как и в комментарии pmg, '\ 0' идет туда, где вы хотите, чтобы строка заканчивалась, поэтому, если вы хотите сократить вашу строку, вы можете просто переместить ее ближе кперед или иметь пустую строку , у вас просто есть array[0] = '\0';.Это также можно использовать для токенизации небольших строк внутри одного буфера, как это делает strtok .то есть."Part1 \ 0Part2 \ 0Part3 \ 0".Но я думаю, что это выходит за рамки вопроса.

т.е.Вы хотели сохранить первые 3 символа алфавита в виде строки (не знаю, почему кто-то так поступил бы, но это всего лишь пример):

char array[4];
array[0] = 'a';
array[1] = 'b';
array[2] = 'c';
array[3] = '\0';
printf("%s\n", array);

Если у вас есть что-то вроде char array[] = "Hello";'\ 0' автоматически добавляется для вас.

3 голосов
/ 23 октября 2011

Ваш массив не инициализирован, а также у вас есть массив указателей, а не массив символов. Это должно быть char* array = (char*)malloc(sizeof(char)*size);, если вы хотите массив символов. Теперь у вас есть указатель на первый элемент массива.

0 голосов
/ 23 октября 2011
char *array[size];

array - это не char *, это больше похоже на char ** (указатель на массив символов, с аналогичным указателем на указатель на символ).

Если все, что вам нужно, это строка C, либо:

char array[size];

и убедитесь, что вы завершаете ее 0, либо

char *array;

и убедитесь, что вы правильно выделите и освободите хранилище дляэто (и 0-прекратить это тоже).

...