реклама на сайте
подробности

 
 
> printf, напечатать массив символов
Метценгерштейн
сообщение Nov 14 2014, 23:30
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



что-то не получается.
есть массив char, содержит 5 символов. никакого завершающего нуля нет.
как мне его напечатать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Метценгерштейн
сообщение Nov 17 2014, 19:58
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, Вы правы.
Упустил из виду что первый символ может быть сразу в диапазоне значений

спасет ли ситуацию, если я сразу инициализирую z нулем? Не спасает, не печатает первое слово целиком.

Код
if ((str[i] >= 97) && (str[i] <= 122) || (str[i] >= 65) && (str[i] <= 90))

мне нужен диапазон латинских букв.
так корректно && писать? Вообще, думал, что надо все же одну &, т.к. это обязательное условие, что диапазон от 97 до 122.

зато если инициализировать z = -1;
то тогда все нормально, первое слово печатает. если что- дальше значение переинициализируется и программа нормально отработает.
Код
void main (void)
{
    setlocale(LC_ALL, "Russian");
    int z1 =-1;
    char str[] = "прh,алf,б,авпле,gkпрб,alfer,онLфу,qwert.";

    for (int i = 0; i < sizeof(str); i++)
    {
        if (str[i] == ',') {
             z1 = i; // запомнили где запятая (начало слова)
        }

        if ((str[i] >= 97) && (str[i] <= 122) || (str[i] >= 65) && (str[i] <= 90))
        {             
            for (int f = 0; f < 6; f++)
            {
                if ( ((str[(z1 + 1 + f)]) == ',') || ((str[(z1 + 1 + f)]) == '.') ) // дошли до второй запятой или точки
                {
                    i = z1 + f;
                    printf("\n");
                    break;
                }
                char c = str[(z1 + 1 + f)]; // печатает символы по одному, пока не встретит запятую
                printf("%c", c);
            }
                
        }
            
        }
    system("pause>nul");
}


давайте тогда сразу уже по критике. Что еще глаз режет? Данный код полностью рабочий.
Задача- даны слова через запятую. После последнего слова- точка. слова до 5 букв. Вывести только те слова, где есть латинские буквы.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 17 2014, 21:38
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Метценгерштейн @ Nov 17 2014, 22:58) *
спасет ли ситуацию, если я сразу инициализирую z нулем?

Не спасет, т.к. запятая вполне может оказаться в самом начале строки (str[0]), а потому индекс z1==0 для запятой вполне легален.

Цитата(Метценгерштейн @ Nov 17 2014, 22:58) *
if ((str[i] >= 97) && (str[i] <= 122) || (str[i] >= 65) && (str[i] <= 90))
мне нужен диапазон латинских букв.
так корректно && писать? Вообще, думал, что надо все же одну &, т.к. это обязательное условие, что диапазон от 97 до 122.

Корректно так:
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')
где оператор || соединяет два логических выражения, заключенных в скобки (лишние скобки я удалила, чтобы не мешали видеть логику).

Как я вижу, вы по-прежнему не понимаете разницы между операциями & и &&, а так же между | и ||, а потому я вынуждена продолжить объяснения. Бинарные операторы & и | работают с ЦЕЛЫМИ ЧИСЛАМИ, и в результате своей операции тоже дают ЦЕЛОЕ ЧИСЛО. В этом смысле они родные братья арифметических операторов + - * / и по существу от них ничем не отличаются. Тогда как логичеcкие операторы && и || работают с БУЛЕВЫМИ величинами типа TRUE и FALSE. И результат их операции тоже БУЛЕВАЯ величина.

Переход от числовых величин к булевым осуществляют обычно операторы сравнения < <= > >= == !=. Именно они работают с числами, а в результате дают буля. После того, как вы что-то сравнили, у вас все числа и литеры превратились в булей, а потому дальше работать с булями возможно лишь с помощью && и ||,а про остальную арифметику забыть.

Язык C зачастую позволяет смешение типов, порой даже не выдавая на этот счет предупреждения, однако НЕ НАДО (!!!) без особой необходимости этим злоупотреблять. Этим вы не компилятору сделаете хуже, а самому себе! А если C++ будете осваивать, то там со смешением типов и вовсе строго. Поэтому чем раньше приучаться к дисциплине, тем лучше. А по началу предлагаю вам писать в качестве комментария обоснование причины, когда вы смешиваете разные типы, подсовывая операторам плохоперевариваемые продукты.

Вы ведь не делите букву на букву, когда понимаете, что в этих байтах лежат буквы, а не цифры? А, значит, разницу должны понимать, несмотря на то, что компилятору разделить две буквы друг на друга не составит труда. Это потому что язык С такой покладистый и малоругачий.

Например, почему я заменила выражение
str[i] >= 97
на
str[i] >= 'a'
хотя это в кодах одно и тоже? А потому что в первом случае в комментариях должно быть написано:
str[i] >= 97 // Я, Метценгерштейн, старый м...к, до сих пор не понимаю разницы между буквами и цифрами sm.gif
Между тем, второй вариант был бы совершенно правильным, если бы по смыслу массив str был бы набит числами, скажем, от 8-разрядного АЦП.
Вот и в том старом варианте резало глаз, когда вы скармливали числовому оператору & два булевских аргумента. Я сразу же его пожалела, а вы не заметили, что ему скормили.

Бывают случаи, когда действительно есть необходимость подвергнуть букву числовой операции. Например, чтобы превратить большую литеру в маленькую и обратно. Но это тот самый уважительный случай, когда возникла НЕОБХОДИМОСТЬ! А вот заменять литеру 'z' на число 122 у вас такой необходимости не было, а потому и должны писать в комментарии оправдание своим действиям.

Цитата(Метценгерштейн @ Nov 17 2014, 22:58) *
давайте тогда сразу уже по критике. Что еще глаз режет? Данный код полностью рабочий.

Ваш код режет глаз тем, что с фиговым z1 вообще на надо входить в цикл f! Лучше было бы написать проще, оно и понятнее:

Код
int z1 = 0;  // начало первого слова

for (int i = 0; i < sizeof(str); i++)
{
  if (str[i] == ',' || str[i] == '.')  // если нашли запятую или точку, то
  { for (int f = z1; f < i; f++) printf("%c", str[f]);  // печатаем слово до запятой или точки
    printf("\n");
    z1 = i+1;  // запоминаем начало следующего слова
  }
}

А если требуется фильтрация алфавитных литер от прочих, то вставляете выражение
if ((str[f] >= 'a' && str[f] <= 'z') || (str[f] >= 'A' && str[f] <= 'Z')
в цикл f перед печатью.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   printf   Nov 14 2014, 23:30
- - Xenia   Цитата(Метценгерштейн @ Nov 15 2014, 02:3...   Nov 14 2014, 23:37
|- - alx.bilous   Цитата(Xenia @ Nov 15 2014, 02:37) Как ст...   Nov 24 2014, 11:09
|- - Xenia   Цитата(alx.bilous @ Nov 24 2014, 14:09) p...   Nov 24 2014, 12:00
- - Метценгерштейн   а если у меня массив символов не всегда 5, а может...   Nov 14 2014, 23:51
|- - Xenia   Цитата(Метценгерштейн @ Nov 15 2014, 02:5...   Nov 15 2014, 00:11
|- - ViKo   Цитата(Метценгерштейн @ Nov 15 2014, 02:5...   Nov 15 2014, 10:13
- - Метценгерштейн   Код#include <math.h> #include "stdafx....   Nov 15 2014, 09:52
|- - l1l1l1   Цитата(Метценгерштейн @ Nov 15 2014, 12:5...   Nov 15 2014, 10:52
|- - Xenia   Цитата(Метценгерштейн @ Nov 15 2014, 12:5...   Nov 15 2014, 16:08
- - Метценгерштейн   давайте разбираться. переменная z1. Я ее объявляю ...   Nov 17 2014, 18:08
|- - doom13   Цитата(Метценгерштейн @ Nov 17 2014, 21:0...   Nov 17 2014, 18:23
|- - Xenia   Цитата(Метценгерштейн @ Nov 17 2014, 21:0...   Nov 17 2014, 19:17
- - Метценгерштейн   в целом да, согласен. Насчет 97 и 'a'- дав...   Nov 18 2014, 09:19
|- - Xenia   Цитата(Метценгерштейн @ Nov 18 2014, 12:1...   Nov 18 2014, 15:59
- - alx.bilous   гцц понимает, keil понимает, аврка понимает, iar ...   Nov 24 2014, 12:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 20:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016