Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Вырезка символа из числа  (Прочитано 34805 раз)
0 Пользователей и 17 Гостей смотрят эту тему.
loid
Гость
« : 21-10-2008 09:16 » 

Народ, подскажите как сделать нечно на СИ. На BASICе знаю как делать, но сейчас пишу на СИ (в процессе изучения). Предположим есть вот что:
int a=5473564763823645;

Какую команду задействовать чтобы из этого числа взять 6-ю цифру и положить её в v. А так же любую другую цифру.
Помогите пожалуйста.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 21-10-2008 09:22 » 

int a=5473564763823645

int?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
loid
Гость
« Ответ #2 : 21-10-2008 09:26 » 

Может я не так объяснил. Какая функция может из числа читать символы, указав какой по счету.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 21-10-2008 09:34 » 

Цитата: loid
Какая функция может из числа читать символы, указав какой по счету.
А какая функция это делала в BASIC?

Я знаю только функцию, которая со строками работает, но не с числами. И читает она символы, а не цифры.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
loid
Гость
« Ответ #4 : 21-10-2008 09:40 » 

В BASICе функцию звать MID$. Она вырезает опрелелённое количество символов с опрелелённого места строки. Как это сделать в СИ?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 21-10-2008 09:41 » 

Sla, Вполне так нормальное число, если у него стоит 64 разрядная система и 64 разрядный компилятор.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 21-10-2008 09:42 » 

Цитата
В BASICе функцию звать MID$. Она вырезает опрелелённое количество символов с опрелелённого места строки. Как это сделать в СИ?
loid, Строки, или числа. Это два разных понятия.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 21-10-2008 09:44 » 

подсказка Улыбаюсь :

Код:
int a=5473564763823645;

int n6=a/(10*10*10*10*10*10)%10; //шестая цифра
Записан

loid
Гость
« Ответ #8 : 21-10-2008 09:45 » 

Изначатьно это число. Пусть даже я его преобразую в строку символов (кстати тоже не знаю как делать), а потом вырезать из него всё что угодно.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 21-10-2008 09:47 » 

Ну Леша тебе показал прямой путь работы с числом. Простая арифметика.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
loid
Гость
« Ответ #10 : 21-10-2008 09:49 » 

Нее... как вырезать симвой из строки символов?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 21-10-2008 09:50 » 

кстати, ой, это я для 5-й цифры сделал )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 21-10-2008 09:51 » 

кстати, вырезать или достать ? Тоже разное
Записан

loid
Гость
« Ответ #13 : 21-10-2008 09:54 » 

Улыбаюсь Я ж говорю, на ВАСИКЕ команда (если кто с ним знаком) string=MID$(a,c)
Может конечно что и наврал.
Как это же написеть на си.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #14 : 21-10-2008 09:58 » 

loid,

1. положи свои цифры в строку.
2. циклом пройдись по строке.
3.  сохрани значение на нужной позиции в переменную.
4. делай дальше что нужно.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
loid
Гость
« Ответ #15 : 21-10-2008 10:00 » 

В том то и дела я не знаю как 3-й пункт выполнить. Какой оператор или функчия вырезает символы из строки?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 21-10-2008 10:02 » 

Ну если ты имееш ввиду чистый C то функция
Цитата
char * strncpy (char *restrict to, const char *restrict from, size_t size)     Function
This function is similar to strcpy but always copies exactly size characters into to.

If the length of from is more than size, then strncpy copies just the first size characters. Note that in this case there is no null terminator written into to.

If the length of from is less than size, then strncpy copies all of from, followed by enough null characters to add up to size characters in all. This behavior is rarely useful, but it is specified by the ISO C standard.

The behavior of strncpy is undefined if the strings overlap.

Using strncpy as opposed to strcpy is a way to avoid bugs relating to writing past the end of the allocated space for to. However, it can also make your program much slower in one common case: copying a string which is probably small into a potentially large buffer. In this case, size may be large, and when it is, strncpy will waste a considerable amount of time copying null characters.

Работа с нуль терминальной строкой точно такая же, как и работа с массивом. Так что читай теорию. Сушность строки в С это массив типа char.
« Последнее редактирование: 21-10-2008 10:06 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
loid
Гость
« Ответ #17 : 21-10-2008 10:06 » new

спасибо, пошел пробовать. А чем перевести число в строку? Улыбаюсь
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #18 : 21-10-2008 10:09 » 

Цитата
int snprintf (char *s, size_t size, const char *template, ...)     Function
The snprintf function is similar to sprintf, except that the size argument specifies the maximum number of characters to produce. The trailing null character is counted towards this limit, so you should allocate at least size characters for the string s.

The return value is the number of characters which would be generated for the given input, excluding the trailing null. If this value is greater or equal to size, not all characters from the result have been stored in s. You should try again with a bigger output string. Here is an example of doing this:

          /* Construct a message describing the value of a variable
             whose name is name and whose value is value. */
          char *
          make_message (char *name, char *value)
          {
            /* Guess we need no more than 100 chars of space. */
            int size = 100;
            char *buffer = (char *) xmalloc (size);
            int nchars;
            if (buffer == NULL)
              return NULL;
         
           /* Try to print in the allocated space. */
            nchars = snprintf (buffer, size, "value of %s is %s",
                               name, value);
            if (nchars >= size)
              {
                /* Reallocate buffer now that we know
                   how much space is needed. */
                buffer = (char *) xrealloc (buffer, nchars + 1);
         
                if (buffer != NULL)
                  /* Try again. */
                  snprintf (buffer, size, "value of %s is %s",
                            name, value);
              }
            /* The last call worked, return the string. */
            return buffer;
          }
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #19 : 21-10-2008 10:18 » 

itoa, atoi, под вендой (не помню библиотеку) StrToInt, IntToStr.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #20 : 21-10-2008 10:21 » 

Код:
int main()
{
    положили число в строку;

    for(цикл по длине строки)
    {
            if(если счетчик равен нужной позиции)
               кладем ее в переменную;
    }

    что то тут делаем;

    return 0;
}
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #21 : 21-10-2008 10:25 » 

А еще Улыбаюсь нужно уметь пользоваться поиском. На нашем форуме такая тема уже поднималась и там все (в примерах) рассказано Ага
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 21-10-2008 15:30 » 

itoa, atoi, под вендой (не помню библиотеку) StrToInt, IntToStr.

itoa - это не thread safe! Лучше воспользоваться функциями серии sprintf.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
loid
Гость
« Ответ #23 : 22-10-2008 02:47 » 

Народ опять проблема. Вот пытаю функцию strncpy

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

 int main(void)
 {
    char string[10];
    char *str1 = "abcdefghi";

    strncpy(string, str1, 3);
    string[3] = '\0';
    printf("%s\n", string);
    return 0;
 }

Вот что я понял из функции strncpy(string, str1, 3);
string - сюда он кладёт результат операций "вырезания"
str1 - с какой переменной производится вырезка
число 3 - сколько символов вырезает

Мне собственно нужно, как говорил выше, пройтись циклом по массиву и за каждый проход вырезать по одному символу. В место троечки (3) поставлю единицу, с этим понятно, в куда ставить с какого символа начинать вырезать? HELP!!!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 22-10-2008 03:17 » 

loid, просканировать символы в цикле можно так:

Код:
int len= ::strlen(str1);
for(int i=0; i<len; i++)
{
   str1[i]; //очередной символ
}
Записан

loid
Гость
« Ответ #25 : 22-10-2008 03:44 » 

а как перевести число в строку символов?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 22-10-2008 03:51 » 

Код:
//длину важно выбрать так, чтобы не вылезли за край массива
//либо использовать специальные классы для работы со строками
//тут я взял 100 байт - число не должно столько символов содержать, поэтому влезет
enum
{
   e_len=100,
};

const char* text[e_len];
::memset(text,0,e_len*sizeof(*text));

int a=5473564763823645;

//печатаем, как беззнаковое целое (с минусом бороться - отдельная исторя)
sprintf(text,"%u",a);

в MFC:
Код:
int a=5473564763823645;
CString txt;

//печатаем, как беззнаковое целое (с минусом бороться - отдельная исторя)
txt.Format("%u",a);

Записан

loid
Гость
« Ответ #27 : 22-10-2008 04:04 » 

я понимаю что задаю достаточно глупые вопросы. Но всё же. Какая функция переводит целое число в строку символов?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 22-10-2008 04:22 » 

в примере выше

1)sprintf
2)CString::Format
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #29 : 22-10-2008 06:02 » 

Код:
int main()
{
    int k = 123456789;
    char ch[9];
    char res;

    sprintf(ch,"%i",k);

    for(unsigned int i = 0; i < strlen(ch); i++)
    {
            if(i == 5)
               res = ch[i]; //тут будет пятый символ, т.е. в переменной будет число 6.
    }

    return 0;
}
« Последнее редактирование: 22-10-2008 06:04 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines