2010-01-31 3 views
3

Есть ли способ узнать, имеет ли элемент в строке в C значение или нет? Я пробовал использовать NULL, '' и '', но они, похоже, не работают. Мне нужно сместить символы до индекса 0 без использования функций stdlib.Как мы узнаем, что строковый элемент в C не инициализирован?

#include <stdio.h> 

int main() 
{ 
    char literal[100]; 

    //literal[99] = '\0' 
    literal[98] = 'O'; 
    literal[97] = 'L'; 
    literal[96] = 'L'; 
    literal[95] = 'E'; 
    literal[94] = 'H'; 

    int index = 0; 

    while(literal[index] != '\0') 
    { 
     if(literal[index] == NULL) // does not work 
     printf("Empty");    

     else 
     printf("%c", literal[index]); 

     ++index;     
    } 

    getchar(); 
    return 0; 

}

+0

У вас есть ответ. Что именно вы пытаетесь сделать? –

+0

Это хороший начинающий вопрос C ... +1 от меня ... несмотря на то, что я не объясняю точно вашу цель в том, что вы пытаетесь сделать ... – t0mm13b

+0

Мне нужно написать базовую программу преобразования без использования библиотечных функций. Нам предоставляется глобальная строка со 100 элементами. Я деляю десятичную базу на новую базу и присваиваю остаток последнему элементу строки. Затем я назначаю другие остатки, а также последнее частное, к другим элементам, идущим влево в строке. Теперь мне нужно сдвинуть все элементы влево, положив первый элемент в индекс 0. Я мог бы также поменять порядок элементов, но первый подход пришел мне на ум. – user246392

ответ

6

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

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

char literal[100]; 

char literal[100] = {0}; 

инициализировать каждый элемент 0. Вы должны были бы изменить ваше время проверки завершения цикла в

while(index < 100) { 
    if(literal[index] == 0) 
     printf("Empty"); 
    ... 
    } 
} 

Это не может быть оптимальным, если вам нужно выполнить больше строк манипуляции на массив, хотя, как 0 теперь означает пустой элемент, а также «конец строки».

3

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

1

C не инициализирует ничего по умолчанию. Поэтому содержимое в вашей строке - это всякий мусор, который был в этой памяти, тем, что использовалось последним в стеке. Вам нужно явно установить каждое значение буква для значения, которое означает «unset» для вас.

1

Нет, не существует способа узнать, какое значение имеет массив. Вы можете, однако, инициализировать его с выбранным значением «по умолчанию» по вашему выбору и позже проверить на это.

1

Вы должны установить конец строки 0 (ноль) или «\ 0» - C делает только это автоматически для строковых литералов, а не локальные переменные в стеке

Попробуйте

memset(&literal, 0, 100); 

Или просто раскомментировать свою линию, которая устанавливает буквальным с индексом 99 к «\ 0»

+1

'NULL' не' '\ 0'' - первая константа нулевого указателя, последняя -' int', равная 0. –

+0

Алок прав. На большинстве (всех?) Современных архитектур у них есть совместимое представление, но это не гарантировано и никогда не должно приниматься. – dmckee

+0

Большое спасибо за напоминание, я отредактирую свой ответ –

0

Строка c - это всего лишь куча мест расположения памяти и соглашение, что '\0' отмечает конец. Отсутствует принудительное выполнение компилятора и нет прикрепленных метаданных (если вы не создаете структуру для ее предоставления).

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

Застраховать, что есть значимые данные, есть ответственность вашего, что предполагает, что вы должны инициализировать все строки либо во время объявления, либо сразу после выделения. Исключение к правилу редки и предпринимаются на ваш страх и риск.

0

Нет, это неопределенное поведение как время выполнения, поскольку все, что нам нужно, может засунуть в несколько двоичных символов ASCII, вы действительно не хотите вникать в это.Лучший способ борьбы с ним, чтобы использовать цикл и итерацию через него или использовать calloc, который инициализирует указатель, но устанавливает его на 0.

 
for (i = 0; i < 100; i++) literal[i] = '\0'; 

OR 

char *literalPtr = (char*)calloc(100, sizeof(char)); // Array of 99 elements plus 1 for '\0' 

Там нет абсолютно никакой гарантии, при этом, что. Следовательно, это будет классифицироваться как неопределенное поведение, поскольку оно зависит от реализации компилятора и исполнения.

Надеюсь, это поможет, С уважением, Tom.

Смежные вопросы