Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / вырезает число из строки после запятой / 25 сообщений из 79, страница 1 из 4
09.06.2020, 23:51
    #39967641
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Привет.
дано : чистый Си без плюсов !
Задача : есть массив символов (будем называть такие массивы в данной задаче строками) . в ней после запятой число. так вот надо вырезать это число и сохранить в другую строку.
Но не работает. Запускаю пошагово:
1) первая итерация во втором цикле успешно пропускается так как запятая
2) вторая итерация на строке
Код: plaintext
1.
*result = *s1;  


тоже отрабатывает предсказуемо.
но затем я выполняю
Код: plaintext
1.
result++


я думал должен быть переход на указатель следующего символа в строке result, однако происходит непонятная вещь. такое ощущение, что перехода на следующий символ не происходит и пишется всё в первый.
Что я делаю не так , где туплю ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
void numbercut(const char* s1, char* result) //вырезает число из строки после запятой
{
       for (; *s1 != ','; s1++); //доходим до запятой
    for (; *s1 != '\0'; s1++) {
        if (isdigit(*s1)) { 
            *result = *s1; 
            result++; 
        }
    }
    *result = '\0'; //маркируем конец строки.
}
int main(){
    char cut[100]="";
    char source[100]="abcd,100";
    numbercut(source, cut);
return 0 ;
}
...
Рейтинг: 0 / 0
10.06.2020, 00:18
    #39967651
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
andron81,

У меня твой код отработал совершенно корректно, я не вижу ошибки. В чём у тебя проблема?
...
Рейтинг: 0 / 0
10.06.2020, 00:31
    #39967658
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
andron81,

Возможно ты пытаешься отлаживать Релиз версию. Переключись на Дебаг. Другое дело что у тебя в коде... ну глюк скажем так. Попробуй:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int cutTest()
{
    char cut[100]="";
    char source[100]="abcd,1*2*3*4";
    numbercut(source, cut);
    return 0 ;
}


Результат:

авторcut == "1234"
...
Рейтинг: 0 / 0
10.06.2020, 01:00
    #39967661
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
source = "abcd, 100, no number 234, another number,101, and one more,102"

что ваша функция должна возвратить?
...
Рейтинг: 0 / 0
10.06.2020, 06:46
    #39967671
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
mini.weblab,
Не рассматриваем такие варики
...
Рейтинг: 0 / 0
10.06.2020, 07:41
    #39967681
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Так затесть
Код: plaintext
1.
char source[100]="abcd100";



И надо бы добавить вывод результата, иначе оптимизатор упростит этот код до
Код: plaintext
1.
return 0 ;
...
Рейтинг: 0 / 0
10.06.2020, 08:07
    #39967686
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
andron81
Что я делаю не так

Код: plaintext
1.
2.
for (; *s1 != ','; s1++);
for (; *s1 != '\0'; s1++)


s1 не содержит "," => segfault
s1 не null terminated => segfault
Код: plaintext
1.
char cut[100]


result короче, чем должен - повреждение памяти => segfault / уязвимость с выполнением произвольного кода.

Си - это серьёзно. Нельзя вот так вот код шлёпать.
Модератор: Edited
...
Рейтинг: 0 / 0
10.06.2020, 09:05
    #39967694
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Давайте обсуждать топик а не автора.
...
Рейтинг: 0 / 0
10.06.2020, 09:30
    #39967700
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
mayton,

Ну а что он провоцирует? Я сейчас вот тоже зайду под виртуалом и наваяю сборник нубских ошибок.
...
Рейтинг: 0 / 0
10.06.2020, 09:36
    #39967703
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Не надо нам тут никаких виртуалов. Он - новичек. Задает вопросы новичка. Тоесть все как-бы по феньшую.

Он же не претендует на большее, верно?
...
Рейтинг: 0 / 0
10.06.2020, 09:42
    #39967705
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
mayton
Он - новичек. Задает вопросы новичка.

Ладно, ладно. Пойду приму таблетки
...
Рейтинг: 0 / 0
10.06.2020, 09:48
    #39967709
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <cstdlib>
#include <string>
#include <regex>
#include <stdio.h>

using namespace std;

int main(int argc, char** argv)
{
  std::string str = "The test, message,the, test ,message";
  str = regex_replace(str, std::regex("(,.*)+$"), "");

  printf("\r\n%s\r\n", str.c_str());

  return 0;
}
...
Рейтинг: 0 / 0
10.06.2020, 09:50
    #39967710
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
rdb_dev, читай ТЗ внимательно
andron81
дано : чистый Си без плюсов !
...
Рейтинг: 0 / 0
10.06.2020, 09:59
    #39967715
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
rdb_dev,

Надо с glibc регулярку, но не знаю, считает ли TC её кошерной.
...
Рейтинг: 0 / 0
10.06.2020, 10:07
    #39967718
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Можно scanf попробовать еще. Он имеет сходный функционал. И даже atoi обладает некой толерантностью
к строкам.

Только надо кейсы описать. Типа

InOut100100hello,100100hello,100,world100hello,world0, or throw an error!
...
Рейтинг: 0 / 0
10.06.2020, 10:20
    #39967725
вырезает число из строки после запятой
crutchmaster
rdb_dev,

Надо с glibc регулярку, но не знаю, считает ли TC её кошерной.

регулярку для ловли запятой - это как из пушки по воробьям
регулярки тяжёлые
...
Рейтинг: 0 / 0
10.06.2020, 10:30
    #39967730
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
InOutscanfatoicustom FSM100100+100,world100+hello,100100hello,100,world100hello,world0, or throw an error!
...
Рейтинг: 0 / 0
10.06.2020, 10:36
    #39967734
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Да и еще проблема в том что в сях (кажется) нет механизма исключений. Тоесть если мы не нашли число?

Вроде есть сигналы. Но как они применимы в данном случае - ХЗ.

Ну а у автора в его сорцах протокол вообще простой. Если мы не нашли число то мы просто не заполняем result.
Хотя мне такой подход не нравится. Ведь ожидалось число.

И еще непонятно что делать с сверх-длинными целыми числами которые не влезают в регистр.
...
Рейтинг: 0 / 0
10.06.2020, 10:41
    #39967736
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
InOutscanfatoicustom FSMFAT and ugly regular expr100100++100,world100++hello,100100+hello,100,world100+hello,world0, or throw an error!+10000000000000000000000000?
...
Рейтинг: 0 / 0
10.06.2020, 11:09
    #39967752
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
"Вырезать из строки число после запятой" означает, что надо отыскать первую запятую и скопировать в результат все цифры, которые найдутся после этой запятой.
Никаких чисел в регистрах и размеров регистров в этой задаче нет. Есть уточняющие вопросы.
...
Рейтинг: 0 / 0
10.06.2020, 11:11
    #39967753
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Это просто развитие идеи.
...
Рейтинг: 0 / 0
10.06.2020, 11:39
    #39967775
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Была в одном из номеров журнала "Техника-молодёжи" шутливая страница "Зачем просто, если можно сложно?". Технический юмор на марше.
А "развитие идеи" это такая шутка программистов, которая непонятна blockman?
...
Рейтинг: 0 / 0
10.06.2020, 11:42
    #39967778
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Заметь! Регулярки я не предлагал
...
Рейтинг: 0 / 0
10.06.2020, 12:19
    #39967804
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
crutchmaster
rdb_dev,
Надо с glibc регулярку, но не знаю, считает ли TC её кошерной.


конечно же это жесть. регулярки ещё тут не хватало.
код действительно рабочий: на выходе число после запятой, но отладка работает странно. стоит режим Debug.
итак ход выполнения второго цикла :
итерация 1 там запятая мы её игнорим - итерация как писал ранее не интересна .
итерация 2 стоп-кадр1 - всё понятно. только что отработала строка помеченная стрелочкой
итерация 2 стоп-кадр2 - а вот тут уже интересно: здесь только что отработала строчка ниже после предыдущей
и почему в result такие значения ?


стоп-кадр1

стоп-кадр2
...
Рейтинг: 0 / 0
10.06.2020, 12:24
    #39967809
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вырезает число из строки после запятой
Basil A. Sidorov
"Вырезать из строки число после запятой" означает, что надо отыскать первую запятую и скопировать в результат все цифры, которые найдутся после этой запятой.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
void numbercut(const char* s1, char* result)
//копируем число из строки после запятой в строку result
{
	while(  *s1 != '\0' ) {
		if (*s1 == ',') {
			s1++;
			while(isdigit(*s1)) {
				*result = *s1;
				s1++;
				result++;
			}
                        // bug sits here
			if ( isdigit(*(result-1)) ){
				break;
			}
		}
		else
			s1++;
	}
	*result = '\0';
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / вырезает число из строки после запятой / 25 сообщений из 79, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]