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

обработка символьной и строковой информации - C++

Восстановить пароль Регистрация
 
Sedoy
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 16
10.09.2011, 10:40     обработка символьной и строковой информации #1
Изменить текст, чтоб слова разделились ровно одним пробелом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2011, 10:40     обработка символьной и строковой информации
Посмотрите здесь:

C++ ОБРАБОТКА СИМВОЛЬНОЙ ИНФОРМАЦИИ В С++
Обработка символьной информации C++
Обработка символьной информации C++
C++ Обработка символьной информации
Обработка символьной информации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
10.09.2011, 14:30     обработка символьной и строковой информации #2
Вот вариант.
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
#include <stdio.h>
 
char*  strspace(char* str, char ch) {
   char* tmp = str;
   char* sa, *sb;
   int   cnt = 0, len;
 
   while( *str ) {
        if( *str == ch )
             cnt++;
        else {
             if(cnt > 1) {
                  len = --cnt;
                  while(len--)
                       for(sa = str-cnt, sb = str-(cnt+1); *sb; *sb++ = *sa++);
                  str -= cnt;
             }
             cnt = 0;
         }
         *str++;
   }
   return tmp;
}
 
 
int  main(void) {
 
      char str[] = "the Token        skynet    ?    ops.    NULL";
 
      puts( strspace(str, ' ') );
 
      getchar();
      return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.09.2011, 16:02     обработка символьной и строковой информации #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <sstream>
#include <string>
 
int main()
{
    std::string text;
 
    std::cout << "Enter text: ";
    std::getline(std::cin, text);
 
    std::istringstream istr(text);
    std::string temp;
 
    std::cout << "Converted text: ";
 
    while (istr >> temp)
        std::cout << temp << ' ';
 
    std::cout << std::endl;
 
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2011, 20:28     обработка символьной и строковой информации #4
Реализация на Си
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>//malloc realloc
#include <stdio.h>  //i\o
#include <ctype.h>  //toupper
#include <conio.h>  //getch
 
//Ввод тектса пока не встретим ch_end
char * GetInputText(char * str, long &sLen, char ch_end);
char * RemNumSpaces(char * str);
 
int main()
{
    long sLen;
    char * str = (char *)malloc(sizeof(char));
    do
    {
        printf("Enter text\r\n:>");
        str = GetInputText(str, sLen, '\n');
        printf("\tString after removing spaces\r\n");
        printf("%s\r\n",str = RemNumSpaces(str));
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
char * GetInputText(char * str, long &sLen, char ch_end)
{
    if(str != NULL)
    {
        sLen = 0;
        while((str[sLen] = getchar()) != ch_end)
            str = (char *)realloc(str,(1 + (sLen = sLen + 1))*sizeof(char));
        str[sLen] = '\0';//Убрали мусор вконце
    }
    return str;
}
 
char * RemNumSpaces(char * str)
{
    if(str != NULL)
    {
        long sLen, lPos = 0;
        char * buf = strstr(str,"  ");
        while(buf)
        {
            sLen = strlen(str);
            lPos = sLen - strlen(buf);
            //string1  string2 string3
            //buf ==   string2 string3
            //memmove  -> str == string1 string2 string3
            memmove((void *)&str[lPos + 1],(void *)&str[lPos + 2],sLen - lPos - 1);
            str[sLen - 1] = '\0';
            buf = strstr(str,"  ");
        }
    }
    return str;
}
Миниатюры
обработка символьной и строковой информации  
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2011, 20:50     обработка символьной и строковой информации #5
Вариант С++ (вместо memmove ввёл аналогичную по действию свою strmove)
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>//malloc realloc
#include <ctype.h>  //toupper
#include <conio.h>  //getch
 
using namespace std;
 
//Руссификация
ostream& operator<<(ostream &stream,char* s){
        for(char* ps=s; *ps; ps++){
                if(*ps=='ё')
                        stream<<char(241);
                else if(*ps=='Ё')
                        stream<<char(240);
                else if(*ps>=-64 && *ps<=-17)                   
                        stream<<char(*ps+64+128);
                else if(*ps<0)
                        stream<<char(*ps+64+176);
                else
                        stream<<*ps;
        }
        return stream;
}
 
char * strmove(char * ptr1, char * ptr2, long size);
char * RemNumSpaces(char * str);
 
 
int main()
{
    char str[1024];
    do
    {
        std::cout<<"Введите текст (не более 1023 символа)\r\n:>";
        std::cin.getline(str,1023);
        std::cout<<"\tСтрока после удаления множственных пробелов\r\n";
        std::cout<<strcpy(str,RemNumSpaces(str))<<"\r\n";
        std::cout<<"Y - новый ввод\r\n";
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
char * strmove(char * ptr1, char * ptr2, long size)
{
    if(ptr1 != NULL && ptr2 != NULL)
    {
        for(long i = 0; i < size; i++)
            ptr1[i] = ptr2[i];
    }
    return ptr1;
}
 
char * RemNumSpaces(char * str)
{
    if(str != NULL)
    {
        long sLen, lPos = 0;
        char * buf = strstr(str,"  ");
        while(buf)
        {
            sLen = strlen(str);
            lPos = sLen - strlen(buf);
            //string1  string2 string3
            //buf ==   string2 string3
            //strmove  -> str == string1 string2 string3
            strmove((char *)&str[lPos + 1],(char *)&str[lPos + 2],sLen - lPos - 1);
            str[sLen - 1] = '\0';
            buf = strstr(str,"  ");
        }
    }
    return str;
}
Миниатюры
обработка символьной и строковой информации  
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2011, 20:59     обработка символьной и строковой информации #6
Подумал, и решил показать упрощенный Си вариант (strmove взял из С++ варианта) - таким образом почти не используем библиотечных функция

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
43
44
45
46
47
48
49
50
51
52
53
#include <string.h> //strlen strcpy
#include <stdio.h>  //i\o
#include <ctype.h>  //toupper
#include <conio.h>  //getch
 
char * strmove(char * ptr1, char * ptr2, long size);
char * RemNumSpaces(char * str);
 
int main()
{
    char ch,str[1024];
    do
    {
        printf("Enter text (less then 1023 symbols)\r\n:>");
        scanf("%[^\n]%c",str,&ch);
        printf("\tString after removing spaces\r\n");
        printf("%s\r\n",strcpy(str,RemNumSpaces(str)));
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
char * strmove(char * ptr1, char * ptr2, long size)
{
    if(ptr1 != NULL && ptr2 != NULL)
    {
        for(long i = 0; i < size; i++)
            ptr1[i] = ptr2[i];
    }
    return ptr1;
}
 
char * RemNumSpaces(char * str)
{
    if(str != NULL)
    {
        long sLen, lPos = 0;
        char * buf = strstr(str,"  ");
        while(buf)
        {
            sLen = strlen(str);
            lPos = sLen - strlen(buf);
            //string1  string2 string3
            //buf ==   string2 string3
            //strmove  -> str == string1 string2 string3
            strmove((char *)&str[lPos + 1],(char *)&str[lPos + 2],sLen - lPos - 1);
            str[sLen - 1] = '\0';
            buf = strstr(str,"  ");
        }
    }
    return str;
}
Результат работы аналогичен предыдущим!
PS:В заключение скажу, что если исходная строка str нам не нужна то можем просто выводить её по токенам (для этого нужна функция strtok - данный вариант не привожу он очень тривиален, и впринцепе уже рассмотрен здесь http://www.cplusplus.com/reference/c...string/strtok/)
Yandex
Объявления
10.09.2011, 20:59     обработка символьной и строковой информации
Ответ Создать тему
Опции темы

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