Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
17 / 17 / 3
Регистрация: 14.10.2009
Сообщений: 82
1

Строки в С

15.12.2009, 00:58. Показов 1792. Ответов 19

Author24 — интернет-сервис помощи студентам
Добрый вечер всем!
Подскажите пожалуйста как можно найти длину той части строки S которая содержит только символы из строки S1 (Что то похожее на стандартную функцию С++ StrSpn, но функция strspn возвращает индекс первого символа в строке string1, который не принадлежит множеству символов string2. Это значение эквивалентно длине начальной подстроки в строке string1, которая полностью состоит из символов строки string2. Нулевой символ окончания строки string2 не рассматривается. Если string1 начинается с символа, не входящего в string2, strcpn возвращает 0.)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2009, 00:58
Ответы с готовыми решениями:

Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки...

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно...

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2
Сформировать динамический двумерный массив, заполнить его случайными числами и удалить строки,...

Удалить строки, начиная со строки К1 и до строки К2 (динамические массивы)
#include <iostream> #include <ctime> #include <stdlib.h> using namespace std; int main() {...

19
32 / 32 / 7
Регистрация: 26.10.2009
Сообщений: 98
15.12.2009, 01:39 2
Тогда тебе нужно вначале использовать эту функцию:
size_t strcspn(const char *s, const char *reject);

Функция strcspn() вычисляет длину начального сегмента строки s, состоящего только из символов, не указанных в строке reject.
потом обрезать указанную строку до первого символа, который входит в S1 и потом уже использовать :

size_t strspn(const char *s, const char *accept);

Функция strspn() вычисляет длину начального сегмента строки s, состоящего только из символов строки accept.
0
17 / 17 / 3
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 02:24  [ТС] 3
не так не катит...((
вообщем, никаких стандартных функций обработки строк использовать нельзя...
0
32 / 32 / 7
Регистрация: 26.10.2009
Сообщений: 98
15.12.2009, 02:37 4
Ну чтож, тогда так ( если я правильно понял задание):

перебирай строку S, пока в ней не встретится символ из S1, а дальше перебирай, пока не встретиться символ, не входящий в S1 и запомни количество переборов.

Добавлено через 2 минуты
Тебе придется написать функцию наподобие этой:
C
1
2
3
4
5
6
7
8
9
bool isCharAtStr(char ch, char* str, int strLength)
{
    for (int i = 0; i < strLength; i++) {
        if (str[i] == ch) {
            return true;
        }
    }
    return false;
}
0
17 / 17 / 3
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 02:52  [ТС] 5
впринципе да, можно попробовать, сенк)
0
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
15.12.2009, 02:52 6
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
31
#include <stdio.h>
 
size_t pseudo_strspn(char *s, char *accept)
{
    size_t i, j, len;
    
    for(i = 0; s[i] != '\0'; i++)
        for(j = 0; accept[j] != '\0'; j++)
            if(s[i] == accept[j])
                goto NEXT;
NEXT:
    for(len = 0; s[i] != '\0'; i++) {
        for(j = 0; accept[j] != '\0'; j++)
            if(s[i] == accept[j]) {
                len++;
                break;
            }
        if(accept[j] == '\0')
            break;
    }
    return len;
}
 
int main(void)
{
    char s[] = "hello world";
    char accept[] = "hello";
 
    printf("len = %u\n", pseudo_strspn(s, accept));
    return 0;
}
0
17 / 17 / 3
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 03:08  [ТС] 7
спасиб, ребят, большое!! очень признателен!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
15.12.2009, 09:18 8
Для разнообразия...
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
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
/* Подсчёт в строке s1 количества символов из строки s2. В случае ошибки возвращает EOF */
size_t charCount(const char *s1, const char *s2){
    size_t count;
    
    if ( !s1 || !*s1 || !s2 || !*s2 )
        return EOF;
    for ( count = 0; *s1; s1++ )
        if ( strchr(s2, *s1) )
            count++;
    
    return count;
}
 
int main(void){
    char str1[BUFSIZ], str2[BUFSIZ], *p;
    size_t num;
    
    while ( 1 ){
        printf("First string: ");
        if ( !fgets(str1, BUFSIZ, stdin) )
            exit(1);
        if ( *str1 == '\n' )
            exit(0);
        if ( p = strrchr(str1, '\n') )
            *p = '\0';
        printf("Second string: ");
        if ( !fgets(str2, BUFSIZ, stdin) )
            exit(1);
        if ( *str2 == '\n' )
            exit(0);
        if ( p = strrchr(str2, '\n') )
            *p = '\0';
        if ( ( num = charCount(str1, str2) ) == EOF )
            exit(1);
        printf("%d characters from \"%s\" found in \"%s\".\n", num, str2, str1);
    }
    exit(0);
}
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.12.2009, 09:34 9
Код
В случае ошибки возвращает EOF
size_t >= 0, EOF < 0
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
15.12.2009, 10:34 10
Цитата Сообщение от accept Посмотреть сообщение
size_t >= 0, EOF < 0
Код
$ grep EOF /usr/include/stdio.h 
#ifndef EOF
# define EOF (-1)
За исключением каких-то очень экзотичных систем, оно же - единицы во всех разрядах.
C
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void){
    size_t i = EOF;
    printf("%X\n", i);
    return 0;
}
Выводит FFFFFFFF
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.12.2009, 11:19 11
Код
4.9 INPUT/OUTPUT <stdio.h>

4.9.1 Introduction

   The header <stdio.h> declares three types, several macros, and many
functions for performing input and output.

   The types declared are size_t (described in $4.1.5); 

         FILE

which is an object type capable of recording all the information
needed to control a stream, including its file position indicator, a
pointer to its associated buffer, an error indicator that records
whether a read/write error has occurred, and an end-of-file indicator
that records whether the end of the file has been reached; and

         fpos_t

which is an object type capable of recording all the information
needed to specify uniquely every position within a file.

   The macros are NULL (described in $4.1.5); 

         _IOFBF
         _IOLBF
         _IONBF

which expand to distinct integral constant expressions, suitable for
use as the third argument to the setvbuf function;

         BUFSIZ

which expands to an integral constant expression, which is the size of
the buffer used by the setbuf function;

         EOF

which expands to a negative integral constant expression that is
returned by several functions to indicate end-of-file ,that is, no
more input from a stream;
у тебя получает код, что типа функция, которая не может возвратить отрицательное значение, всё равно его возвращает - это ж туман
тем более, что она действительно не возвращает его, а возвращает просто огромное число
а при этой инфе, вообще получается, что она возвращает что-то
плюс наслоение (а вдруг там действительно такое огромное количество символов, получится правильный результат == ошибке)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
15.12.2009, 12:13 12
Цитата Сообщение от accept Посмотреть сообщение
типа функция, которая не может возвратить отрицательное значение, всё равно его возвращает
Функции типа по сараю, какое она число возвращает. Это для нас они (числа) отрицательные или положительные, а машине важно лишь - заморачиваться еденицей в старшем разряде, или нет. Константа EOF выбирается такой, чтобы быть достаточно "дикой" для правдоподобного результата. Учитывая, то, что считаются символы в строке, значение UINT_MAX всё-таки какое-то большое
Вот к примеру кусок кода, который по Вашей логике и компилироваться не должен бы. Однако работает и во всех случаях правильно...
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
#include <stdio.h>
 
unsigned minusVal1(unsigned val){
    return val * -1;
}
 
unsigned minusVal2(int val){
    return val * -1;
}
 
int main(void){
    int i;
    unsigned u;
    
    i = 1;
    printf("%d %d %d\n", i, minusVal1(i), minusVal2(i));
    
    i = -1;
    printf("%d %d %d\n", i, minusVal1(i), minusVal2(i));
    
    u = 1;
    printf("%d %d %d\n", u, minusVal1(u), minusVal2(u));
    u = -1;
    printf("%d %d %d\n", u, minusVal1(u), minusVal2(u));
    
    return 0;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
16.12.2009, 04:40 13
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
#undef EOF
#define EOF (-4294967290)
 
main()
{
    printf("%lu" "\n", EOF);
    return 0;
}
Цитата Сообщение от easybudda
Учитывая, то, что считаются символы в строке, значение UINT_MAX всё-таки какое-то большое
а они не равны, EOF и ULONG_MAX, просто совпадают
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
16.12.2009, 09:05 14
Цитата Сообщение от accept Посмотреть сообщение
а они не равны, EOF и ULONG_MAX, просто совпадают
Ага. Но этого вполне достаточно, чтобы использовать константу EOF в качестве сигнала об ошибке.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
16.12.2009, 10:16 15
нельзя в том случае её использовать, потому что она может совпасть с каким-то количеством символов в строке
и пример выше показывает, что EOF может спокойно преобразоваться в шесть (ну это для примера, там может быть что угодно, хоть пятнадцать)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
16.12.2009, 10:42 16
Цитата Сообщение от accept Посмотреть сообщение
нельзя в том случае её использовать, потому что она может совпасть с каким-то количеством символов в строке
и пример выше показывает, что EOF может спокойно преобразоваться в шесть (ну это для примера, там может быть что угодно, хоть пятнадцать)
Это, если отыскать систему, в которой EOF, как
C
1
#define EOF (-4294967290)
определена На 4 разных смотрел - везде -1. Короче, не нравится - не используйте. А по-моему вполне нормальный способ. И понятный, и не замороченный.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.12.2009, 01:41 17
ну, наконец-то
так вот, выше текст - это кусок стандарта, то есть, любой компилятор имеет право установить такой EOF
спасибу ставлю за то, что кое-что понял, благодаря тому коду
очень важное

size_t там надо поменять на long int, тогда это будет подходить для строк в пределах двух гигабайт на современных системах и EOF тогда будет подходить по знаку (код ясен и не нужно думать, что там преобразовывается)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
17.12.2009, 02:06 18
Цитата Сообщение от accept Посмотреть сообщение
любой компилятор имеет право установить такой EOF
Ага, имеет... Найти бы ещё такой... Строго говоря совсем правильно было бы long int использовать, но и так работать будет. Знаете компилятор, в котором EOF - не (-1) - назовите, интересно! Мне представляется, что значение этой константы должно выбираться по такой примерно логике:
NULL == 0
EOF == ~0
Где-то когда-то читал про чуднЫе системы, в которых и в байте не 8 бит и отрицательные числа не дополнительным кодом записываются... Вот там EOF может и был бы смысл какое-то другое значение присваивать. Но в жизни я таких никогда не встречал. Так, что, имхо можно этим просто не заморачиваться...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.12.2009, 10:52 19
Цитата Сообщение от easybudda
в котором EOF - не (-1) - назовите, интересно!
в любой вписать значение и будет нормально

Цитата Сообщение от easybudda
Мне представляется, что значение этой константы должно выбираться по такой примерно логике:
логику предугадать трудно, что угодно может быть
даже не компиляторы рассмотреть, а несколько разных версий одного
я, вот, думаю, что EOF делается как -1 только потому, что это первое отрицательное число после нуля
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
17.12.2009, 11:07 20
Цитата Сообщение от accept Посмотреть сообщение
я, вот, думаю, что EOF делается как -1 только потому, что это первое отрицательное число после нуля
Или потому, что в дополнительном коде -1 - это как раз тот самый "не ноль" не зависимо от размера переменной, которой это значение присваивается...
Цитата Сообщение от accept Посмотреть сообщение
в любой вписать значение и будет нормально
Учитывая вышесказанное - с какой целью?
0
17.12.2009, 11:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2009, 11:07
Помогаю со студенческими работами здесь

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой...

Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки
Помогите пожалуйста! 1)Даны три строки. Определить можно ли из символов третьей строки получить...

Ввести строки и через n символов первой строки вставить вторую строку, и так до конца строки
Помогите исправить баг задача состоит в следующем :ввести строку и простроку тоесть две строки и...

Сравнить строки, первый несовпадающий элемент строки-приемника записать в регистр AL, строки-источника - в DL
Помогите написать программу на ассемблерене совсем еще разобрался с этим задание: Ввести с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru