Форум программистов, компьютерный форум CyberForum.ru

Си-шные строки, как вытащить подстроку - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Определение внешнего IP адреса http://www.cyberforum.ru/cpp-beginners/thread513055.html
Необходимо определять внешний IP адрес. Задача усложнена тем, что много пользователей сидят за NAT'ом. Находил примеры где ip получают через сайты (типо myip_ru или ippages_com) Но это всё костыльные решения, т.к. формат не стандартизирован и в любой момент данная зависимость может перестать работать (либо сдохнет сайт, либо его админы решат сменить формат, либо еще что-то... вплодь до выдачи...
C++ Удалить строку и столбец целочисленной квадратной матрицы Дана целочисленная квадратная матрица порядка n. Удалить из нее строку и столбец, на пересечении которых находится максимальный элемент (считаем, что он один). Добавлено через 11 часов 46 минут помогите,пожалуйста! http://www.cyberforum.ru/cpp-beginners/thread513049.html
C++ C++, Программа-фильтр , циклические процессы..
Завтра сдавать, не поманию как... 1) С помощью оператора цикла с постусловием напишите программу-фильтр, которая вводит любые символы, но комментирует только буквы русского алфавита. Завершение работы - по нажатию буквы ‘Я’. 2)
C++ Bool переменные - как записать таблицы истинности функции, используя цикл
Пусть есть 4 переменых типа bool (x1, x2, x3 ,x4) и логическая функция (y = !x1 x3 + x2!x4) как записать таблицы истинности даной функции используя цыкл?
C++ Адаптировать задачу для работы с файлом http://www.cyberforum.ru/cpp-beginners/thread513038.html
Дали такое задание: написать функцию revpositn которая которая принмает два параметра str1,str2 типа string и возвращает позицию начала первого появления в str1 текста содержащего литеры str2 в обратном порядке. Другими словами при вводе слов vnesnos sen выведет 2. Теперь суть проблемы. Написать программу я написал, и она работает: #include <iostream> #include <stdio.h> #include <string> ...
C++ Реализация класса "Время" Помогите в реализации класса 1.разность двух времен в секундах, 2.прибавление ко времени одной секунды, 3.сравнение двух времен, Заранее спасибо! Добавлено через 57 секунд #include "stdafx.h" #include <iostream> подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.03.2012, 00:19     Си-шные строки, как вытащить подстроку
Цитата Сообщение от go Посмотреть сообщение
const char* const substr(char* s, size_t pos, size_t count)
Модификатор доступа у возвращаемого функцией значения в С - UB. Может и работать, но лучше так не делать.
Цитата Сообщение от go Посмотреть сообщение
return strncpy(buf, s + pos, count);
Тоже не комильфо. Из биэсдишного мануала:
The strncpy() function copies at most len characters from src into dst.
If src is less than len characters long, the remainder of dst is filled
with `\0' characters. Otherwise, dst is not terminated.
...
The following copies as many characters from input to buf as will fit and
NUL terminates the result. Because strncpy() does not guarantee to NUL
terminate the string itself, this must be done explicitly.

char buf[1024];

(void)strncpy(buf, input, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';
То есть опять же может работать, может не работать...

Я бы как-то так сделал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>
 
/* Копирует в dst не больше cnt символов из src начиная с позиции pos.
Память под принимающую строку должна быть заранее выделена с учётом завершающего нуля. */
char * substr(char * dst, const char * src, size_t pos, size_t cnt){
    size_t len;
    
    if ( ! dst || ! src || strlen(src) < pos )
        return NULL;
    
    if ( ( len = strlen(src + pos) ) > cnt )
        len = cnt;
    strncpy(dst, src + pos, len);
    dst[len] = '\0';
    
    return dst;
}
 
int main(void){
    char src[BUFSIZ], dst[BUFSIZ];
    size_t pos, cnt;
    
    while ( printf("String: ") && fgets(src, BUFSIZ, stdin) && *src != '\n'
        && printf("Start pos: ") && scanf("%u", &pos) == 1
        && printf("Count: ") &&  scanf("%u%*c", &cnt) == 1 )
            printf("Result: %s\n", substr(dst, src, pos, cnt));
    
    return 0;
}
 
Текущее время: 21:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru