Форум программистов, компьютерный форум 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) С помощью оператора цикла с постусловием напишите программу-фильтр, которая вводит любые символы, но комментирует только буквы русского алфавита. Завершение...
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 в...
C++ Реализация класса "Время" Помогите в реализации класса 1.разность двух времен в секундах, 2.прибавление ко времени одной секунды, 3.сравнение двух времен, Заранее спасибо! Добавлено через 57 секунд #include... подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
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;
}
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru