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

Строки в С - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 00:58     Строки в С #1
Добрый вечер всем!
Подскажите пожалуйста как можно найти длину той части строки S которая содержит только символы из строки S1 (Что то похожее на стандартную функцию С++ StrSpn, но функция strspn возвращает индекс первого символа в строке string1, который не принадлежит множеству символов string2. Это значение эквивалентно длине начальной подстроки в строке string1, которая полностью состоит из символов строки string2. Нулевой символ окончания строки string2 не рассматривается. Если string1 начинается с символа, не входящего в string2, strcpn возвращает 0.)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2009, 00:58     Строки в С
Посмотрите здесь:

Дан безразмерный массив.Вставить количество символов каждой строки вначало этой же строки. C++
C++ Вывести строки файла, после строки добавляя, сколько раз в ней встретилось слово
C++ Вывести на экран все строки данного массива одну за другой в виде целой строки
Как сделать так, что бы длинна строки сама менялась при вводе строки? C++
C++ Переместить вниз строки массива, в которых сумма элементов строки меньше ноля
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sayrus89
 Аватар для Sayrus89
31 / 31 / 1
Регистрация: 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.
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 02:24  [ТС]     Строки в С #3
не так не катит...((
вообщем, никаких стандартных функций обработки строк использовать нельзя...
Sayrus89
 Аватар для Sayrus89
31 / 31 / 1
Регистрация: 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;
}
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 02:52  [ТС]     Строки в С #5
впринципе да, можно попробовать, сенк)
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 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;
}
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 03:08  [ТС]     Строки в С #7
спасиб, ребят, большое!! очень признателен!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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);
}
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.12.2009, 09:34     Строки в С #9
Код
В случае ошибки возвращает EOF
size_t >= 0, EOF < 0
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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;
у тебя получает код, что типа функция, которая не может возвратить отрицательное значение, всё равно его возвращает - это ж туман
тем более, что она действительно не возвращает его, а возвращает просто огромное число
а при этой инфе, вообще получается, что она возвращает что-то
плюс наслоение (а вдруг там действительно такое огромное количество символов, получится правильный результат == ошибке)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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, просто совпадают
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
16.12.2009, 09:05     Строки в С #14
Цитата Сообщение от accept Посмотреть сообщение
а они не равны, EOF и ULONG_MAX, просто совпадают
Ага. Но этого вполне достаточно, чтобы использовать константу EOF в качестве сигнала об ошибке.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2009, 10:16     Строки в С #15
нельзя в том случае её использовать, потому что она может совпасть с каким-то количеством символов в строке
и пример выше показывает, что EOF может спокойно преобразоваться в шесть (ну это для примера, там может быть что угодно, хоть пятнадцать)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
16.12.2009, 10:42     Строки в С #16
Цитата Сообщение от accept Посмотреть сообщение
нельзя в том случае её использовать, потому что она может совпасть с каким-то количеством символов в строке
и пример выше показывает, что EOF может спокойно преобразоваться в шесть (ну это для примера, там может быть что угодно, хоть пятнадцать)
Это, если отыскать систему, в которой EOF, как
C
1
#define EOF (-4294967290)
определена На 4 разных смотрел - везде -1. Короче, не нравится - не используйте. А по-моему вполне нормальный способ. И понятный, и не замороченный.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.12.2009, 01:41     Строки в С #17
ну, наконец-то
так вот, выше текст - это кусок стандарта, то есть, любой компилятор имеет право установить такой EOF
спасибу ставлю за то, что кое-что понял, благодаря тому коду
очень важное

size_t там надо поменять на long int, тогда это будет подходить для строк в пределах двух гигабайт на современных системах и EOF тогда будет подходить по знаку (код ясен и не нужно думать, что там преобразовывается)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2009, 02:06     Строки в С #18
Цитата Сообщение от accept Посмотреть сообщение
любой компилятор имеет право установить такой EOF
Ага, имеет... Найти бы ещё такой... Строго говоря совсем правильно было бы long int использовать, но и так работать будет. Знаете компилятор, в котором EOF - не (-1) - назовите, интересно! Мне представляется, что значение этой константы должно выбираться по такой примерно логике:
NULL == 0
EOF == ~0
Где-то когда-то читал про чуднЫе системы, в которых и в байте не 8 бит и отрицательные числа не дополнительным кодом записываются... Вот там EOF может и был бы смысл какое-то другое значение присваивать. Но в жизни я таких никогда не встречал. Так, что, имхо можно этим просто не заморачиваться...
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.12.2009, 10:52     Строки в С #19
Цитата Сообщение от easybudda
в котором EOF - не (-1) - назовите, интересно!
в любой вписать значение и будет нормально

Цитата Сообщение от easybudda
Мне представляется, что значение этой константы должно выбираться по такой примерно логике:
логику предугадать трудно, что угодно может быть
даже не компиляторы рассмотреть, а несколько разных версий одного
я, вот, думаю, что EOF делается как -1 только потому, что это первое отрицательное число после нуля
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2009, 11:07     Строки в С
Еще ссылки по теме:

C++ В динамической матрице целых чисел добавить строки после строки, содержащей простое число
C++ Определить, верно ли утверждение: сумма элементов каждой i-й строки матрицы больше суммы (i-1)-й строки
C++ Определить, верно ли утверждение: сумма элементов каждой i-ой строки матрицы больше суммы (i-1)-ой строки

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2009, 11:07     Строки в С #20
Цитата Сообщение от accept Посмотреть сообщение
я, вот, думаю, что EOF делается как -1 только потому, что это первое отрицательное число после нуля
Или потому, что в дополнительном коде -1 - это как раз тот самый "не ноль" не зависимо от размера переменной, которой это значение присваивается...
Цитата Сообщение от accept Посмотреть сообщение
в любой вписать значение и будет нормально
Учитывая вышесказанное - с какой целью?
Yandex
Объявления
17.12.2009, 11:07     Строки в С
Ответ Создать тему

Метки
Строки
Опции темы

Текущее время: 17:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru