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

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

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

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

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

Добрый вечер всем!
Подскажите пожалуйста как можно найти длину той части строки 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     Строки в С
Посмотрите здесь:

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

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

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

Слить две строки, вставив символы одной строки между символами другой строки - Pascal
Строка a из n символов лексикографически меньше строки b из n символов, если существует такой индекс j, что aj < bj, а для всех i < j ai =...

Определить длину строки. Если длина строки >6, удалить часть строки в { } скобках. - Turbo Pascal
Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной...

Строки. Если в конце строки точка отсутствует, то найти слово, заканчивающееся точкой и перенести его в конец строки. - Pascal
Дана строка, состоящая из слов и содержащая одну точку в конце одного из слов. Если в конце строки точка отсутствует, то найти слово,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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
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;
}
Wital
15 / 15 / 1
Регистрация: 14.10.2009
Сообщений: 82
15.12.2009, 03:08  [ТС]     Строки в С #7
спасиб, ребят, большое!! очень признателен!
easybudda
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
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
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.12.2009, 09:34     Строки в С #9
Код
В случае ошибки возвращает EOF
size_t >= 0, EOF < 0
easybudda
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
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
4821 / 3241 / 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
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
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
4821 / 3241 / 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
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
16.12.2009, 09:05     Строки в С #14
Цитата Сообщение от accept Посмотреть сообщение
а они не равны, EOF и ULONG_MAX, просто совпадают
Ага. Но этого вполне достаточно, чтобы использовать константу EOF в качестве сигнала об ошибке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2009, 10:16     Строки в С
Еще ссылки по теме:

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

Строки. Определить длину введенной строки, если длина кратна 4, то первая часть строки меняется местами со второй - Turbo Pascal
Ввести с клавиатуры строку символов.признак окончания ввода строки-нажатие клавиши ввод.Программа должна определить длину введенной строки...

Строки. Даны строка S и подстрока S1.Удалить из строки S все вхождения строки S1 - Turbo Pascal
Даны строка S и подстрока S1.Удалить из строки S все вхождения строки S1.В строке S подсчитать кол-во вхождений строки S1.

БД с операциями: добавление новой строки, удаление строки, редактирование имеющейся строки - PascalABC.NET
Нужно создать базу данных в паскале, с операциями: добавление новой строки, удаление строки, редактирование имеющей строки. Желательно с...


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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2009, 10:16     Строки в С #15
нельзя в том случае её использовать, потому что она может совпасть с каким-то количеством символов в строке
и пример выше показывает, что EOF может спокойно преобразоваться в шесть (ну это для примера, там может быть что угодно, хоть пятнадцать)
Yandex
Объявления
16.12.2009, 10:16     Строки в С
Ответ Создать тему
Опции темы

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