Char x [50] и Char x [100] Выход - PullRequest
       26

Char x [50] и Char x [100] Выход

1 голос
/ 13 января 2012

Я не привык к C, так как я в основном парень по Java, обладающий некоторыми знаниями по C ++, так что извините, если это тривиальный вопрос. Не могу найти ответ при поиске в Интернете.

Я инициализирую массив символов ...

char tcp[50];

Так что я могу соединить const char и char. В примерах я видел простой способ сделать это путем создания этого пустого массива char с последующим использованием ...

strcat(x,y);

Чтобы склеить их.

Проблема в том, что распечатка пустого массива char, когда он установлен в "50", дает мне результат:

X??|? 

Когда я изменяю это на ...

char tcp[100];

И распечатай, пустое. Почему это?

Ответы [ 5 ]

7 голосов
/ 13 января 2012

Содержимое массива не определено, при условии, что это локальный (автоматический) массив.

Использование:

char tcp[50] = "";

Или:

char tcp[50] = {0};

Или:

char tcp[50];
tcp[0] = 0;

Или:

char tcp[50];
memset(tcp, 0, sizeof(tcp));

Как вам нравится.

1 голос
/ 13 января 2012

При создании массива компилятор помещает его где-то в память, но не инициализирует его, поэтому все, что находится в этой памяти при запуске программы, будет исходной «строкой».

Завершить строку вручную после создания массива, либо обнулив весь массив, либо просто поставить ноль в качестве первого символа:

char tcp[50] = { '\0' };

Или

char tcp[50];
/* ... */
tcp[0] = '\0';
1 голос
/ 13 января 2012

C удачно выделяет место для массива, который вы объявляете, но не устанавливает его содержимое равным 0.

Поэтому содержимое массива, который вы печатаете, является случайным (или, скорее, зависит от предыдущегосодержимое памяти)

1 голос
/ 13 января 2012

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

tcp[0] = '\0';
0 голосов
/ 13 января 2012

Разница здесь в том, что вы, по сути, работаете с двумя пустыми массивами, пытаясь объединить их в одну область памяти (не уверен, имеет ли это для вас смысл).

Прежде всего, в CВы должны завершить строки с \0.Это то, что не выставлено или не видно в Java.Кроме того, вы, по сути, использовали две неопределенные строки (поскольку значение не установлено).

#include <stdio.h>
#include <string.h>

char target[256];
const char source_a[] = "Hello";
const char source_b[] = "World!";

int void(main)
{
    target[0] = '\0'; // this essentially empties the string as we set the first entry to be the end. Depending on your language version of C, you might as well write "char target[256] = {'\0'};" above.
    strcat(target, source_a); // append the first string/char array
    strcat(target, " "); // append a const string literal
    strcat(target, source_b); // append the second string

    printf("%s\n", target);

    return 0;
}

Важно: Использование strcat() может быть небезопасным, так как проверка длины не выполняется, и кроме Java эти "строки"иметь фиксированную длину (ту, которую вы устанавливаете при определении переменных).Если длина не указана, но вы копируете строку при инициализации, эта длина берется (например, char test[] = "Hello!"; будет иметь длину 7 символов (из-за завершения \0)).

Если вы хотитебольше Java-подобного подхода к строкам, используйте C ++ и класс std::string, который работает намного больше похож на строки Java.

...