Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
#1

Строковый анализатор

02.08.2010, 04:06. Просмотров 827. Ответов 5
Метки нет (Все метки)

Подскажите почему код выдает всякий мусор, подает звуковые сигналы
Должен работать так:
Если введешь так:
"11/23/34" или "11.23.34" или "11.23/34", то должен получить
11
23
34
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
      #include "stdafx.h"
      #include <conio.h>
      using namespace std;
      class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
         int more()   {
         return input_str[pos]!='\0';
         }
         StringParser(char* inp, char* delim){
         input_str = inp; delimiters = delim; pos = 0;
             }
         char* get(){
         int j = 0;
         char* new_str;
         new_str = new char[100];
         while (! strchr(delimiters, input_str[pos]) && input_str[pos]!='\0'){пока не будет ни ."" ни "/"
             new_str[j] = input_str[pos];
             pos++; 
             j++;
         }
         while (strchr(delimiters, input_str[pos]))//пока будет "/" или ",", то увеличить позицию на 1
         pos++;
         new_str[j]='\0';
         return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         StringParser parser(input_str, "/,");
         while (parser.more()){
         ch = parser.get();
         cout << ch << endl;
         delete[]ch;
         }
         return 0;
      }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2010, 04:06
Ответы с готовыми решениями:

Дан строковый файл. Создать новый строковый файл, содержащий все строки исходного файла наименьшей длины (в том же порядке).
Даны имена двух файлов вещественных чисел. Известно, что первый из них...

Строковый массив (объявить пустой глобальный строковый массив из 16 элементов)
Подскажите, как объявить пустой глобальный строковый массив из 16 элементов? ...

Анализатор
Просто подскажите в чем ошибка ? ( не компелируется) #include &lt;fstream&gt;...

Анализатор команд
помогите написать анализатор команд на с++

Лексический анализатор
Получил задание. Ранее с++ не изучал. Если найдутся добрые люди, которые могут...

5
easybudda
Модератор
Эксперт CЭксперт С++
10051 / 5971 / 1491
Регистрация: 25.07.2009
Сообщений: 11,302
02.08.2010, 04:27 #2
Lotles, каким-то Вы очень непростым путём пошли... Вот так даже с кучей проверок проще выглядит:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define DELIM "./"
 
int main(void){
    char buf[BUFSIZ], * p;
    int cnt;
    
    printf("String: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        fprintf(stderr, "Error while reading string!\n");
        exit(EXIT_FAILURE);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf ){
        fprintf(stderr, "String is empty!\n");
        exit(EXIT_FAILURE);
    }
    
    for ( cnt = 0, p = strtok(buf, DELIM); p; ++cnt, p = strtok(NULL, DELIM) )
        printf("%s\n", p);
    
    if ( cnt != 3 )
        printf("Wrong string format!\n");
    
    exit(EXIT_SUCCESS);
}
1
AKE
11 / 11 / 3
Регистрация: 09.05.2010
Сообщений: 384
02.08.2010, 04:40 #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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  #include "stdafx.h"
  #include <conio.h>
  #include "stdio.h"
  #include "iostream.h" 
  #include "string."
      class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
         int more()   {
         return input_str[pos]!='\0';
         }
         StringParser(char* inp, char* delim){
         input_str = inp; delimiters = delim; pos = 0;
             }
         char* get(){
         int j = 0;
         char* new_str;
         new_str = new char[100];
         while (! strchr(delimiters, input_str[pos]) && input_str[pos]!='\0'){
             new_str[j] = input_str[pos];
             pos++; 
             j++;
         }
         while (input_str[pos]!='\0' && strchr(delimiters, input_str[pos]))//ïîêГ* áóäåò "/" èëè ",", ГІГ® óâåëè÷èòü ïîçèöèþ Г*Г* 1
         pos++;
         new_str[j]='\0';
         return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         StringParser parser(input_str, "/,");
         while (parser.more()){
         ch = parser.get();
         cout << ch << endl;
         delete[]ch;
         }
         return 0;
      }
http://www.cplusplus.com/reference/clibrary/cstring/strchr/

Добавлено через 1 минуту
easybudda, Автор видимо начал писать класс и собирается его дописывать впоследствии...
1
ForEveR
02.08.2010, 04:44
  #4

Не по теме:

Отступы вообще непонятно какие... Эх... Почему никто не учит писать с нормальными отступами? (исключения - книжки, форум)

0
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
02.08.2010, 16:22  [ТС] #5
Всем спасибо за ответы но мне надо понять почему в этом случае код работает
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
      #include "stdafx.h"
      #include <conio.h>
      using namespace std;
      class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
         int more()   {
         return input_str[pos]!='\0';
         }
         StringParser(char* inp, char* delim){
         input_str = inp; delimiters = delim; pos = 0;
             }
         char* get(){
         int j = 0;
         char* new_str;
         new_str = new char[100];
         while (strchr(delimiters, input_str[pos]))
         pos++;
         while (! strchr(delimiters, input_str[pos]) && input_str[pos]!='\0'){
             new_str[j] = input_str[pos];
             pos++; 
             j++;
         }
         new_str[j]='\0';
         return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         StringParser parser(input_str, "/,");
         while (parser.more()){
         ch = parser.get();
         cout << ch << endl;
         delete[]ch;
         }
         return 0;
      }
а здесь нет
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
 #include "stdafx.h"
      #include <conio.h>
      using namespace std;
      class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
         int more()   {
         return input_str[pos]!='\0';
         }
         StringParser(char* inp, char* delim){
         input_str = inp; delimiters = delim; pos = 0;
             }
         char* get(){
         int j = 0;
         char* new_str;
         new_str = new char[100];
         while (! strchr(delimiters, input_str[pos]) && input_str[pos]!='\0'){
             new_str[j] = input_str[pos];
             pos++; 
             j++;
         }
         while (strchr(delimiters, input_str[pos]))
         pos++;
         new_str[j]='\0';
         return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         StringParser parser(input_str, "/,");
         while (parser.more()){
         ch = parser.get();
         cout << ch << endl;
         delete[]ch;
         }
         return 0;
      }
Я тока поменял циклы местами, я не понимаю почему так начинает работать(столо интересно почему)
0
AKE
11 / 11 / 3
Регистрация: 09.05.2010
Сообщений: 384
02.08.2010, 20:14 #6
Потому-что в случае, если ch = '\0'
strchr(str, ch) возвращает указатель на конец строки str, а не 0.
http://www.cplusplus.com/reference/clibrary/cstring/strchr/
1
02.08.2010, 20:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2010, 20:14

Текстовой анализатор
написать программу, определяющую корректность выражения, содержащего только...

Лексический анализатор
Написал программу, я надеюсь, лексического анализатора для конкретного куска...

Анализатор кода
Есть исходный файл (код C++) программы. Нужно создать дамп с анализом его...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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