Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
1

[C++] Дана строка. Получить подстроку расположенную...

08.03.2012, 21:47. Показов 2889. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите код дописать пожалуйста в лабе,.. нужно еще одно что бы условие выполнялось, нужно, чтобы имя файла, из которого читается строка, и имя файла, в который записывается, вводились из командной строки.
Сама программа работает но нужно еще подшаманить немного над ней.
Миниатюры
[C++] Дана строка. Получить подстроку расположенную...  
Вложения
Тип файла: zip Lab2.zip (853.2 Кб, 11 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2012, 21:47
Ответы с готовыми решениями:

Дана строка S. Необходимо получить подстроку, расположенную между первым и последним пробелом исходной строки
Пожалуйста, помогите разобраться! Дана строка S. Необходимо получить подстроку, расположенную...

Необходимо получить подстроку, расположенную между первым и последним пробелом исходной строки
помогите пожалуйста!!! Дана строка S. Необходимо получить подстроку, расположенную между первым...

Дана строка и подстрока; вставить подстроку после каждого вхождения 'AB' в строке
товарищи, помогите кто чем может.. голова кипит.. либо я что то не так делаю либо да.. вобщем...

Дана строка. Удалить из нее самую длинную подстроку, что состоит из цифр
Дана строка.Удалить из нее самую длинную подстроку , что состоит из цифр. Блин я недавно изучаю...

20
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
08.03.2012, 22:28  [ТС] 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <cstdlib>
#include <iostream>
 
int Stroka(char a[], char b[]);
int ReadStroka(char const *fname, char a[256]);
int SaveStroka(char const *fname, char a[256]);
 
int main(int argc, char *argv[])
{
    char a[256],b[256];
    ReadStroka("Lab2.txt",a);
    printf("%s\n",a);
    Stroka(a,b);
    SaveStroka("Lab2.1.txt",b);
    printf("%s\n",b);
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
int Stroka(char a[], char b[])
{
     int f=0;int j=0;
     for(int i=0;a[i];i++)
     {
             if(a[i]==':') 
             for(i++;a[i]!=':'&&a[i];i++) b[j++]=a[i];
             else continue;
             b[j]='\0';
             return 1;
             break;
     }
     b[j]='\0';
     return 0;
}
int ReadStroka(char const *fname, char a[256])
{
    FILE *f=fopen(fname,"r");
    int n;
    if(f==NULL)
    {
        return 0;
    }
    fgets(a,256,f);
    fclose(f);
}
 
int SaveStroka(char const *fname, char a[256])
{
    FILE *f=fopen(fname,"w");
    if(f==NULL)
    {
        return 0;
    }
    fprintf(f,"%s",a);
    fclose(f);
}
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
08.03.2012, 22:32 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
24
25
26
27
28
char* findstring(char *str)
{
    char *first = 0;
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        if (str[i] == ';')
        {
            if(!first)
            {
                first = &str[i] + 1;
            }
            
            else
            {
                str[i] = '\0';
                break;
            }
        }
    }
 
    if (!first)
    {
        return "Такая строка не найдена\n";
    }
 
    return first;
}
1
51 / 51 / 4
Регистрация: 04.04.2011
Сообщений: 209
08.03.2012, 22:38 4
Если я правильно понял что ты хочешь то вот здесь поймёшь)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
int main()
{
     FILE *file1,*file2;
     char path1[10],path2[10];
     cin >> path1 >> path2;
     strcat(path1,".txt");
     strcat(path2,".txt");
     file1 = fopen(path1,"a+");
     file2 = fopen(path2,"a+");
     return EXIT_SUCCESS;
}
1
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
08.03.2012, 23:21  [ТС] 5
Блин, там получается что два файла создаются заново,.. а нельзя допустим так сделать что бы: написать имя файла - файл первый из которого читается создался.. потом через командную строку ввести туда строку,,. она запишется в файл, и написать имя файла который создастся, программа закроется и в нем уже будет нужная часть строки когда откроешь файл?... думал еще что бы вручную первый файл создавать и записывать но надо что бы все через командную строку.
0
51 / 51 / 4
Регистрация: 04.04.2011
Сообщений: 209
08.03.2012, 23:24 6
там где тип открытия убери + будет просто а(если файл есть то он его откроет если нету то создаст)
C++
1
2
file1 = fopen(path1,"a");
     file2 = fopen(path2,"a");
так ты можешь сделать тип открытия какой захочешь вот ссылка незнаю можно ли здесь кидать ссылки на посторонние ресурсы но там поймёшь http://devoid.com.ua/functions... fopen.html
1
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
09.03.2012, 00:16  [ТС] 7
Попытался реализовать идею ошибка на инт лезет постоянно
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>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
int main()
int Stroka(char a[], char b[]);
int ReadStroka(char const *fname, char a[256]);
int SaveStroka(char const *fname, char a[256]);
{
    FILE *file1,*file2;
     char path1[10],path2[10];
     cin >> path1 >> path2;
     strcat(path1,".txt");
     strcat(path2,".txt");
     file1 = fopen(path1,"a+");
     file2 = fopen(path2,"a+");
     }
     
     int main(int argc, char *argv[])
{
     char a[256],b[256];
     ReadStroka(path1,".txt",a);
     printf("%s\n",a);
     Stroka(a,b);
     SaveStroka(path2,".txt",b);
     printf("%s\n",b);
     system("PAUSE");
     return EXIT_SUCCESS;
     }
 
 
 
int Stroka(char a[], char b[])
{
     int f=0;int j=0;
     for(int i=0;a[i];i++)
     {
             if(a[i]==':') 
             for(i++;a[i]!=':'&&a[i];i++) b[j++]=a[i];
             else continue;
             b[j]='\0';
             return 1;
             break;
     }
     b[j]='\0';
     return 0;
}
int ReadStroka(char const *fname, char a[256])
{
    FILE *f=fopen(fname,"r");
    int n;
    if(f==NULL)
    {
        return 0;
    }
    fgets(a,256,f);
    fclose(f);
}
 
int SaveStroka(char const *fname, char a[256])
{
    FILE *f=fopen(fname,"w");
    if(f==NULL)
    {
        return 0;
    }
    fprintf(f,"%s",a);
    fclose(f);
}
Добавлено через 30 минут
Вот код такой же лабы только там без файлов выводится и вводится все с командной строке,.. помогите пожалуйста соединить это все с общим кодом а то я вообще уже запутался напроч(((, .. что бы 1)написал имя файла-файл создался 2)написал строку с двоеточиями как по заданию там нажал ентер 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
24
25
26
27
28
29
30
31
#include <cstdlib>
#include <iostream>
 
int Stroka(char a[], char b[]);
 
int main(int argc, char *argv[])
{
    char a[256],b[256];
    printf("Vveite stroku: ");
    scanf("%s",&a);
    if(Stroka(a,b)) printf("%s\n",b);
    else printf("V stroke net dvoetochiya\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
int Stroka(char a[], char b[])
{
     int f=0;int j=0;
     for(int i=0;a[i];i++)
     {
             if(a[i]==':') 
             for(i++;a[i]!=':';i++) b[j++]=a[i];
             else continue;
             b[j]='\0';
             return 1;
             break;
     }
     b[j]='\0';
     return 0;
}
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 01:43 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
char* findstring(char *str);
 
int main()
{
    setlocale(LC_ALL, "");
    char buf[256];
    char filename1[50], filename2[50];
    fstream fs, sc;
 
    _flushall();
    cout << "\nВведите строку текста: " << endl;
    cin.getline(buf, sizeof(buf));
 
    _flushall();
    cout << "Введите имя файла: ";
    cin >> filename1;
    strncat(filename1, ".txt", 5);
    fs.open(filename1, ios::out);
    fs << buf;
 
    _flushall();
    cout << "Введите имя файла: ";
    cin >> filename2;
    strncat(filename2, ".txt", 5);
    sc.open(filename2, ios::out);
    sc << findstring(buf);
 
 
    return EXIT_SUCCESS;
}
 
char* findstring(char *str)
{
        char *first = 0;
        int len = strlen(str);
        for (int i = 0; i < len; i++)
        {
                if (str[i] == ';')
                {
                        if(!first)
                        {
                                first = &str[i] + 1;
                        }
                        
                        else
                        {
                                str[i] = '\0';
                                break;
                        }
                }
        }
 
        if (!first)
        {
                return "Такая строка не найдена\n";
        }
 
        return first;
}
1
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
09.03.2012, 10:37  [ТС] 9
Ох, огромное спасибо !!
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.03.2012, 10:58 10
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
#include <iostream>
#include <string>
 
int main()
{
    std::string str;
    std::getline( std::cin, str );
    
    int first = str.find(':');
    
    if ( first == (int) std::string::npos )
    {
        std::cout << "There are no semicolon" << std::endl;
        return 0;
    }
    
    int second = str.find( ':', first + 1 );
    
    if ( second == (int) std::string::npos )
    {
        std::cout << str.substr( first + 1, str.length() - first ) << std::endl;
        return 0;
    }
    
    std::cout << str.substr( first + 1, second - first - 1 ) << std::endl;
}
0
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
09.03.2012, 14:00  [ТС] 11
А как изменить что бы вручную создать txt в него ввести строку с двоеточиями, сохранить... а через cmd вести имя файла из которого читать будет (то есть ранее созданного) и имя файла который создастся с нужной частью строки?
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
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
char* findstring(char *str);
 
int main()
{
        setlocale(LC_ALL, "");
        char buf[256];
        char filename1[50], filename2[50];
        fstream fs, sc;
 
        _flushall();
        cout << "\nВведите строку текста: " << endl;
        cin.getline(buf, sizeof(buf));
 
        _flushall();
        cout << "Введите имя файла: ";
        cin >> filename1;
        strncat(filename1, ".txt", 5);
        fs.open(filename1, ios::out);
        fs << buf;
 
        _flushall();
        cout << "Введите имя файла: ";
        cin >> filename2;
        strncat(filename2, ".txt", 5);
        sc.open(filename2, ios::out);
        sc << findstring(buf);
 
 
        return EXIT_SUCCESS;
}
 
char* findstring(char *str)
{
        char *first = 0;
        int len = strlen(str);
        for (int i = 0; i < len; i++)
        {
                if (str[i] == ';')
                {
                        if(!first)
                        {
                                first = &str[i] + 1;
                        }
                        
                        else
                        {
                                str[i] = '\0';
                                break;
                        }
                }
        }
 
        if (!first)
        {
                return "Такая строка не найдена\n";
        }
 
        return first;
}
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 14:07 12
всмысле вручную? имя файла читай из массива аргументов argv
1
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
09.03.2012, 14:15  [ТС] 13
Вручную в смысле создать текстовый файл который прога будет читать в папке с программой задать ему имя
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 15:25 14
добавь в open ios::nocreate и тогда он будет открывать файл, если его нету ругаться
1
Заблокирован
Автор FAQ
10.03.2012, 01:48 15
dimakaz5194, вот мой взгляд на задачу
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
73
74
75
76
77
78
79
80
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
 
//Функция осуществляет доступ к файлу с путём fpath
//если доступ не получен возвращаемое значение ЛОЖЬ (false)
bool  AccessToFile(fstream &fs, char * fpath, int flag);
//Возвращает подстроку между первым и след за ним символом symbol
//Возвращаемое значение 0 - если строка не содержит symbol
//1 - если в строке 1 symbol
//2 - если в строке не меньше 2-х symbol
//Исходная строка char *str в процессе работы функции изменяется
int ParseString(char *str, char symbol);
 
int main(int argc, char *argv[])
{
    int nSymbols;//Будет содержать в себе число двоеточий 0,1 или 2
    char str[256];
    fstream fs1, fs2;
    if(argc < 3)//Если не передали аргументами пути к файлам
        //извещаем об этом и выходим
        cout<<"Not enough arguments!\n";
    else
    {
        if(AccessToFile(fs1, argv[1], ios::in))//Первый файл пытаемся открыть для чтения
        if(AccessToFile(fs2, argv[2], ios::out))//Второй файл пытаемся открыть для записи
        {
            //Сюда попадём если открыли оба файла
            fs1.getline(str, 256);
            cout<<"Input string> "<<str<<endl;
            if(!(nSymbols = ParseString(str, ':')))
                cout<<"String not contain \':\'\n";
            else
            {
                cout<<"String contain : "<<nSymbols<<" \':\'"<<endl
                    <<"Substring> "<<str<<endl;
                fs2<<str;
            }
        }
        fs1.close();
        fs2.close();
    }
    system("pause");
    return 0;
}
 
bool  AccessToFile(fstream &fs, char * fpath, int flag)
{
    bool bAccess = false;//Вначале полагаем что доступ к файлу
    //получить не удалось
    fs.open(fpath, flag);
    if(!fs)
        cout<<"Error open : "<<fpath<<endl;
    else
        bAccess = true;//Всё ок
    return bAccess;
}
 
int  ParseString(char * str, char symbol)
{
    int i, ifirst, nSymbols = 0;
    bool bFirst = false;//Флаг что найден первый символ
    for(i = 0; str[i] != '\0' && nSymbols < 2; i++)
    {
        if(str[i] == symbol)
        {
            if((nSymbols++) == 2)//Если нашли 2 символа
                str[i] = '\0'; //подрезаем строку по последнему symbol
            if(!bFirst)
            {
                ifirst = i;//Запоминаем позицию 1-го symbol
                bFirst = true;
            }
        }
    }
    if(nSymbols)
        strcpy(&str[0],&str[ifirst + 1]);
    return nSymbols;
}
Содержание файлов
input.txt This is : the some test
output.txt the some test
Миниатюры
[C++] Дана строка. Получить подстроку расположенную...  
1
Заблокирован
Автор FAQ
10.03.2012, 01:56 16
Тот же алгоритм только с вводом имён файлов непосредственно в коносли
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
73
74
75
76
77
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
 
//Функция осуществляет доступ для записи к файлу с путём fpath
//если доступ не получен возвращаемое значение ЛОЖЬ (false)
bool  AccessToFile(fstream &fs, char * fpath, int flag);
//Возвращает подстроку между первым и след за ним символом symbol
//Возвращаемое значение 0 - если строка не содержит symbol
//1 - если в строке 1 symbol
//2 - если в строке не меньше 2-х symbol
//Исходная строка char *str в процессе работі функции изменяется
int ParseString(char *str, char symbol);
 
int main(/*int argc, char *argv[]*/)
{
    int nSymbols;//Будет содержать в себе число двоеточей 0,1 или 2
    char str[256];
    char path1[32], path2[32];
    fstream fs1, fs2;
    cout<<"Enter filename with input : ";cin>>path1;
    cout<<"Enter filename with output: ";cin>>path2;
    if(AccessToFile(fs1, path1, ios::in))//Первый файл пытаемся открыть для чтения
    if(AccessToFile(fs2, path2, ios::out))//Второй файл пытаемся открыть для записи
    {
        //Сюда попадём если открыли оба файла
        fs1.getline(str, 256);
        cout<<"Input string> "<<str<<endl;
        if(!(nSymbols = ParseString(str, ':')))
            cout<<"String not contain \':\'\n";
        else
        {
            cout<<"String contain : "<<nSymbols<<" \':\'"<<endl
                <<"Substring> "<<str<<endl;
            fs2<<str;
        }
        fs1.close();
        fs2.close();
    }
    system("pause");
    return 0;
}
 
bool  AccessToFile(fstream &fs, char * fpath, int flag)
{
    bool bAccess = false;//Вначале полагаем что доступ к файлу
    //получить не удалось
    fs.open(fpath, flag);
    if(!fs)
        cout<<"Error open : "<<fpath<<endl;
    else
        bAccess = true;//Всё ок
    return bAccess;
}
 
int  ParseString(char * str, char symbol)
{
    int i, ifirst, nSymbols = 0;
    bool bFirst = false;//Флаг что найден первый символ
    for(i = 0; str[i] != '\0' && nSymbols < 2; i++)
    {
        if(str[i] == symbol)
        {
            if((nSymbols++) == 2)//Если нашли 2 символа
                str[i] = '\0'; //подрезаем строку по последнему symbol
            if(!bFirst)
            {
                ifirst = i;//Запоминаем позицию 1-го symbol
                bFirst = true;
            }
        }
    }
    if(nSymbols)
        strcpy(&str[0],&str[ifirst + 1]);
    return nSymbols;
}
Миниатюры
[C++] Дана строка. Получить подстроку расположенную...  
1
Заблокирован
Автор FAQ
10.03.2012, 02:03 17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
strcpy(&str[0],&str[ifirst + 1]);
- возможно эта строка вызовет некоторые сложности с пониманием, поэтому привожу аналогичный по функционалу код поясняющий работу strcpy
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
int  ParseString(char * str, char symbol)
{
    int i, ifirst, nSymbols = 0;
    bool bFirst = false;//Флаг что найден первый символ
    for(i = 0; str[i] != '\0' && nSymbols < 2; i++)
    {
        if(str[i] == symbol)
        {
            if((nSymbols++) == 2)//Если нашли 2 символа
                str[i] = '\0'; //подрезаем строку по последнему symbol
            if(!bFirst)
            {
                ifirst = i;//Запоминаем позицию 1-го symbol
                bFirst = true;
            }
        }
    }
    if(nSymbols)
    {
        for(i = 0; str[i + ifirst + 1] != '\0'; i++)
            str[i] = str[i + ifirst + 1];
        str[i] = '\0';
    }
    return nSymbols;
}
Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(nSymbols)
* * * * {
* * * * * * * * for(i = 0; str[i + ifirst + 1] != '\0'; i++)
* * * * * * * * * * * * str[i] = str[i + ifirst + 1];
* * * * * * * * str[i] = '\0';
* * * * }
- в цикле смещаем влево символы строки str на позицию + 1 символа : - т.е как бы вытираем символы в строке следующее перед двоеточием. +1 - означает что и двоеточие тоже вытираем(а зачем оно нам)
0
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 40
12.03.2012, 12:49  [ТС] 18
Помогите пожалуйста реализовать обработку нного количества строк... а то обрабатывает только одну оч срочно нужно
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
73
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
 
//Возвращает подстроку между первым и след за ним символом symbol
//Возвращаемое значение 0 - если строка не содержит symbol
//1 - если в строке 1 symbol
//2 - если в строке не меньше 2-х symbol
//Исходная строка char *str в процессе работы функции изменяется
int ParseString(char *str, char symbol);
 
int main(int argc, char *argv[])
{
    int nSymbols;//Будет содержать в себе число двоеточей 0,1 или 2
    char str[256];
    char path1[32], path2[32];
    fstream fs1, fs2;
    if(argc < 3)//Если не передали аргументами пути к файлам
        //извещаем об этом и выходим
        cout<<"Not enough arguments!\n";
    else
    {
        fs1.open(argv[1], ios::in);//Первый файл пытаемся открыть для чтения
        fs2.open(argv[2], ios::out);//Второй файл пытаемся открыть для записи
        fs1.getline(str, 256);
        if(!fs1 || !fs2)
            cout<<"Error of open files\n";
        else
        {
            cout<<"Input string> "<<str<<endl;
            if(!(nSymbols = ParseString(str, ':')))
                cout<<"String not contain \':\'\n";
            else
            {
                cout<<"String contain : "<<nSymbols<<" \':\'"<<endl
                    <<"Substring> "<<str<<endl;
                fs2<<str;
            }
            fs1.close();
            fs2.close();
        }
    }
    system("pause");
    return 0;
}
 
int ParseString(char * str, char symbol)
{
    int i, ifirst = -1,ilast = -1, nSymbols = 0;
    bool bFirst = false;//Флаг что найден первый символ
    for(i = 0; str[i] != '\0' && nSymbols < 2; i++)
        {
            if(str[i] == symbol)
            {
                      if((nSymbols++) == 2)//Если нашли 2 символа
                      str[i] = '\0'; //подрезаем строку по последнему symbol
                      if(!bFirst)
                      {
                                 ifirst = i;//Запоминаем позицию 1-го symbol
                                 bFirst = true;
                                 }
                      }
            }
if(nSymbols)
{
ilast = i - 1;
for(i = 0; i < ilast - ifirst; i++)
str[i] = str[i + ifirst + 1];
str[ilast - ifirst - 1] = '\0';
}
return nSymbols;
}
0
Заблокирован
Автор FAQ
13.03.2012, 14:31 19
dimakaz5194, вот и все преобразования
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
73
74
75
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
 
//Возвращает подстроку между первым и след за ним символом symbol
//Возвращаемое значение 0 - если строка не содержит symbol
//1 - если в строке 1 symbol
//2 - если в строке не меньше 2-х symbol
//Исходная строка char *str в процессе работі функции изменяется
int ParseString(char *str, char symbol);
 
int main(int argc, char *argv[])
{
    int nSymbols;//Будет содержать в себе число двоеточей 0,1 или 2
    char str[256];
    fstream fs1, fs2;
    if(argc < 3)//Если не передали аргументами пути к файлам
        //извещаем об этом и выходим
        cout<<"Not enough arguments!\n";
    else
    {
        fs1.open(argv[1], ios::in);//Первый файл пытаемся открыть для чтения
        fs2.open(argv[2], ios::out);//Второй файл пытаемся открыть для записи
        if(!fs1 || !fs2)
            cout<<"Error of open files\n";
        else
        {
            while(!fs1.eof())
            {
                fs1.getline(str, 256);
                cout<<"Input string> "<<str<<endl;
                if(!(nSymbols = ParseString(str, ':')))
                    cout<<"String not contain \':\'\n";
                else
                {
                    cout<<"String contain : "<<nSymbols<<" \':\'"<<endl
                        <<"Substring> "<<str<<endl;
                    fs2<<str<<endl;
                }
            }
            fs1.close();
            fs2.close();
        }
    }
    system("pause");
    return 0;
}
 
int ParseString(char * str, char symbol)
{
    int i, ifirst = -1,ilast = -1, nSymbols = 0;
    bool bFirst = false;//Флаг что найден первый символ
    for(i = 0; str[i] != '\0' && nSymbols < 2; i++)
    {
        if(str[i] == symbol)
        {
            if((nSymbols++) == 2)//Если нашли 2 символа
                str[i] = '\0'; //подрезаем строку по последнему symbol
            if(!bFirst)
            {
                ifirst = i;//Запоминаем позицию 1-го symbol
                bFirst = true;
            }
        }
    }
    if(nSymbols)
    {
        ilast = i - 1;
        for(i = 0; i < ilast - ifirst; i++)
            str[i] = str[i + ifirst + 1];
        str[ilast - ifirst - 1] = '\0';
    }
    return nSymbols;
}
Проверка онлайн здесь http://codepad.org/DYDnD1xo
input.txt
dhfgdfg: gsdjf : jdsfghfdj
fhgkdf : fg
fdlhjdf kfdjk kjfd
hkg: kfhd : jfdh

output.txt
gsdjf
f
kfhd
Миниатюры
[C++] Дана строка. Получить подстроку расположенную...  
1
Заблокирован
Автор FAQ
15.04.2012, 20:03 20
Проект API
Миниатюры
[C++] Дана строка. Получить подстроку расположенную...   [C++] Дана строка. Получить подстроку расположенную...   [C++] Дана строка. Получить подстроку расположенную...  

Вложения
Тип файла: rar APIDiagrams.exe.rar (28.7 Кб, 5 просмотров)
Тип файла: txt diag1.txt (85 байт, 6 просмотров)
0
15.04.2012, 20:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2012, 20:03
Помогаю со студенческими работами здесь

Дана строка, состоящая из букв, цифр, запятых, точек, знаков «+» и «–». Выделить подстроку, которая соответствует записи
Код вроде рабочий, но у меня не работает! ошибка показывает в include. Как исправить ? Дана...

Дана строка, состоящая из букв, цифр, запятых, точек, знаков «+» и «–». Выделить подстроку, которая соответствует записи целого числа.
#include &lt;iostream.h&gt; #include &lt;string.h&gt; int main() { char st,st2; int i,j; cout &lt;&lt;...

Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и «–». Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и «–». Выделить...

Вывести подстроку, расположенную между первым и вторым пробелом исходной строки
Дана строка, содержащая по крайней мере один символ пробела. Вывести подстроку, расположенную...

Вывести подстроку, расположенную между первым и последним пробелом исходной строки
Дана строка, содержащая по крайней мере один символ пробела. Вывести подстроку, расположенную между...

Вывести подстроку, расположенную между первым и вторым пробелом исходной строки
Дана строка,содержащая по крайне мере один символ пробела. Вывести подстроку,расположенную между...


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

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