Начальное состояние строки в C - PullRequest
1 голос
/ 23 февраля 2012

Извините, если это небольшой вопрос, но я новичок в C. Я использую компилятор GCC. Когда я пишу программу со строкой, если строка превышает определенную длину, она начинается с некоторого содержимого. Я беспокоюсь о том, чтобы просто перезаписать его, так как он может быть использован другой программой. Вот пример кода, который показывает проблему:

#include <stdio.h>
// Using the GCC Compiler
// Why is there already something in MyString?
int main(void) {
    char MyString[250];

    printf("%s", MyString);
    getch();
    return 0;
}

Как мне БЕЗОПАСНО избежать этой проблемы? Спасибо за вашу помощь.

Ответы [ 5 ]

5 голосов
/ 23 февраля 2012

Почему в MyString уже что-то есть?

myString не инициализирован и может содержать что угодно.

Чтобы инициализировать пустую строку:

char MyString[250] = { 0 };

или, как указано , раскрутите в своем ответе:

char MyString[250] = "";

, который более читабелен (и соответствует следующему).

Для инициализации в строку:

char myString[250] = "some-string";

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

Каждый запущенный экземпляр вашей программы будет иметь свой собственный myString.

2 голосов
/ 23 февраля 2012

По некоторым причинам многие рекомендуют инициализацию в стиле массива

char myString[50] = { 0 };

, однако, поскольку этот массив предназначен для использования в качестве строки, я считаю его гораздо более понятным и интуитивно понятным (и проще синтаксически) использовать инициализатор строки:

char myString[50] = "";

Это делает то же самое, но значительно упрощает то, что вы собираетесь инициализировать массив, как на самом деле пустая строка.

Ситуация, которую вы видите со «случайными» данными, это то, что происходит в массиве, так как вы не инициализируете его, вы просто получаете то, что происходит там.Это не означает, что память используется какой-то другой программой одновременно, поэтому вам не нужно об этом беспокоиться.Вам do нужно позаботиться о передаче указателя на массив char, который не завершается должным образом 0 для любой функции C, ожидающей строку.

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

Правильная инициализация массива пустой строкой позволяет избежать этой проблемы.

2 голосов
/ 23 февраля 2012

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

C-String оканчивается на '\ 0', поэтому вы должны просто указать что-то вроде

MyString[0] = '\0';

за вашей декларацией. Таким образом вы убедитесь, что такие функции, как printf, работают так, как вы ожидаете, что они будут работать.

0 голосов
/ 23 февраля 2012

Поскольку вы инициализировали массив char любым значением, он будет содержать некоторое значение мусора.Хорошая практика программирования - использовать что-то вроде:

char MyString [250] = "My Array";// Если вы знаете, какой массив будет использоваться

char MyString [250] = '\ 0';// Если вы не собираетесь заполнять данные массива char во время инициализации

0 голосов
/ 23 февраля 2012
char MyString[250] = {0};

но для хорошего использования

std::string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...