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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
#1

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

15.12.2009, 00:58. Просмотров 1209. Ответов 19

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

Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки - C++
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки. 1. Я дуб дубом,даже...

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

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

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

Как считать строки из файла, если там больше одной строки? - C++
Как считать строки из файла в массив. Если в файле одна строка, то нет проблем, но если несколько, то при использовании функции fgets ...

Прибавить ко всем элементам каждой строки максимальное значение этой строки - C++
добрый вечер! Помогите пожалуйста доработать код! Изменить текущий массив, прибавив ко всем элементам каждой строки максимальное...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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.
0
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 02:24  [ТС] #3
не так не катит...((
вообщем, никаких стандартных функций обработки строк использовать нельзя...
0
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;
}
0
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 02:52  [ТС] #5
впринципе да, можно попробовать, сенк)
0
Gravity
562 / 556 / 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;
}
0
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 03:08  [ТС] #7
спасиб, ребят, большое!! очень признателен!
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
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
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.12.2009, 09:34 #9
Код
В случае ошибки возвращает EOF
size_t >= 0, EOF < 0
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
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
accept
4822 / 3243 / 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;
у тебя получает код, что типа функция, которая не может возвратить отрицательное значение, всё равно его возвращает - это ж туман
тем более, что она действительно не возвращает его, а возвращает просто огромное число
а при этой инфе, вообще получается, что она возвращает что-то
плюс наслоение (а вдруг там действительно такое огромное количество символов, получится правильный результат == ошибке)
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
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
accept
4822 / 3243 / 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, просто совпадают
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
16.12.2009, 09:05 #14
Цитата Сообщение от accept Посмотреть сообщение
а они не равны, EOF и ULONG_MAX, просто совпадают
Ага. Но этого вполне достаточно, чтобы использовать константу EOF в качестве сигнала об ошибке.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2009, 10:16 #15
нельзя в том случае её использовать, потому что она может совпасть с каким-то количеством символов в строке
и пример выше показывает, что EOF может спокойно преобразоваться в шесть (ну это для примера, там может быть что угодно, хоть пятнадцать)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2009, 10:16
Привет! Вот еще темы с ответами:

Чтение через fscanf_s части строки с пробелом (и запись этой же строки) - C++
нужно записать в файл строку, содержащую через табуляцию int, char, char, char, float, int. Далее необходимо из такой же строки вывести...

Как первые два символа строки переставить в конец этой строки? - C++
Собственно вопрос

Упорядочить символы строки B в алфавитном порядке и удалить латинские буквы из строки A - C++
&quot;Даны строки A и B. Если в A есть латинские буквы, а в B нет повторяющихся символов, то упорядочить символы B в алфавитном порядке и...

Функция перезаписывает символы строки заданным количеством символов другой строки - C++
Программа работает. Но не совсем правильно. В конечной строке появляются непонятные символы, которых быть там не должно. В программе нельзя...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.12.2009, 10:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru