Цикл массива в C - PullRequest
       44

Цикл массива в C

0 голосов
/ 05 января 2012

Просто интересно, кто-нибудь может мне это объяснить? У меня есть программа, которая просит пользователя ввести предложение. Затем программа читает пользовательский ввод в массив и заменяет все гласные на знак $. Мой вопрос: как работает цикл for? При инициализации char c = 0; не означает ли это, что элемент массива является целым? Я не могу понять, как это работает.

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

int main(void)
{
char words[50];
char c;

printf("Enter any number of words: \n");
fgets(words, 50, stdin);

    for(c = 0; words[c] != '\n'; c++)
    {
            if(words[c] =='a'||words[c]=='e'||words[c]=='i'||words[c]=='o'||words[c]=='u')
            {
                words[c] = '$';
            }
    }
printf("%s", words);

return 0;
}

Ответы [ 5 ]

3 голосов
/ 05 января 2012

Код обрабатывает c как целочисленную переменную (в C char в основном очень узкое целое число). На мой взгляд, было бы чётче объявить его как int (возможно unsigned int). Однако, учитывая, что длина words не более 50 символов, char c работает нормально.

Что касается цикла:

  1. c = 0 инициализирует c в ноль.
  2. words[c] != '\n' проверяет - в самом начале, а также после каждой итерации - является ли текущий символ (words[c]) символом новой строки, и останавливается, если это так.
  3. c++ увеличивается c после каждой итерации.
1 голос
/ 05 января 2012

Массив похож на здание, у вас есть несколько этажей с номером.

В полу 1 живет Джон. В 2 этаже живет Михаил.

Если вы хотите пойти в квартиру Джона, нажмите 1 на лифте. Если вы хотите пойти к Майклу, нажмите 2.

То же самое с массивами. Каждая позиция в массиве хранит значение, в данном случае это буква.

С каждой позицией связан индекс. Первая позиция 0.

Когда вы хотите получить доступ к позиции массива, вы используете массив [position], где position - это индекс в массиве, к которому вы хотите получить доступ.

Переменная c содержит позицию для доступа. Когда вы делаете слова [c], вы фактически получаете доступ к позиции c nt в массиве и извлекаете ее значение.

Допустим, слово это cool

word[1] приводит к o, word[0] Результаты в c

Чтобы определить конец слова, а символ \n устанавливается в последней позиции массива.

0 голосов
/ 05 января 2012

A char - это C является целочисленным типом, как short, int, long и long long (и многие другие типы):

Он определяется как наименьшая адресуемая единица на машине, на которой вы компилируете, и обычно составляет 8 битов, что означает, что он может содержать значения от -128 до 127. А беззнаковый символ может содержать значения от 0 до 255.

В приведенном выше примере он работает как итератор, поскольку он все время останавливается до 50 и может содержать значения до 127. В то время как тип int обычно может содержать значения до 2 147 483 647, но занимает в 4 раза больше места в машине как 8 битный символ Гарантируется, что int только по крайней мере 16 бит в C, что означает значения от -32 768 до 32 767 или 0 - 6,5535 для целого без знака.

Таким образом, ваш цикл просто обращается к элементам в вашем массиве, один за другим, например words[0] в начале, чтобы посмотреть на первый символ, а затем words[1], чтобы посмотреть на следующий символ. Поскольку вы используете символ, который, как я предполагаю, на вашей машине составляет 8 бит, это очень распространено. Вашего char будет достаточно, чтобы хранить итератор для вашего цикла, пока он не превысит 127. Если вы прочитаете более 127 символов (вместо 50) и используете char для итерации, вы столкнетесь со странными проблемами, так как char не может удерживайте 128 и вернитесь к -128. Причинение вам доступа к words[-128], что, скорее всего, приведет к ошибке сегментации.

0 голосов
/ 05 января 2012

Числовые литералы (например, 0 в вашем случае) совместимы с переменными типа char.Фактически, даже символьный литерал, заключенный в одинарные кавычки (например, '\n'), имеет тип int, но неявно преобразуется в char при назначении или сравнении с другим char.

числом.литералы взаимозаменяемы с символьными литералами, если только первые не превышают диапазон символа.

Следующее должно приводить к предупреждению компилятора:

char c = 257;

, тогда как это не будет:

char c = 127;
0 голосов
/ 05 января 2012

Не совсем, char и int неявно преобразуются.

В этом случае char можно рассматривать как меньшее int.sizeof(char) == 1, поэтому он меньше, чем int, возможно, поэтому его использовали.Программно, в этом случае нет никакой разницы, если только входная строка не очень длинная, и в этом случае char будет переполнен раньше, чем int.

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