С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Dilan
8 / 8 / 1
Регистрация: 26.09.2009
Сообщений: 65
#1

помогите найти ошибку - C++

26.09.2009, 15:00. Просмотров 603. Ответов 8
Метки нет (Все метки)

доброе время суток
Столкнулся с такой проблемой, надо сделать прогу которая:
Вводим текст, и из этого текста удаляем слова которые состают из не чётных количество символов
ну например
Он это 2 символа
Она это 3 итд..

вроде сделал, но у меня он не видит первое слово, и не важно оно из 2 или из 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
[SIZE=2]#include<stdio.h>
#include<iostream.h>
#include<string.h>
 
int main(int argc, char* argv[])
{
cout<<"pasalins nelyginius zodzius...:";
char sak[128];
gets(sak);
 
char *sep="\|,<.>/?;;'\|}]{[`!@#$%^&*()-_=+ ";
char *zodis=strtok(sak,sep);
int n;// = strlen(zodis);
while (zodis!= NULL)
{
zodis = strtok (NULL, sep);
if(zodis == NULL)break;
n = strlen(zodis);
if (n%2==0)
cout <<zodis<<" ";
}       
 
int i;
cin>>i;
 
        return 0;
}[/SIZE]
учитель дал пример. я из этого примера сделал то что мне надо (как видете не до конца сделал...) вот тока одно тут не понимаю что обозначает "strtok" на что он влияет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2009, 15:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос помогите найти ошибку (C++):

Помогите найти ошибку: По двум сторонам и углу найти все остальное - C++
Доброго времени суток. В универе дали задание написать программу &quot;По двум сторонам и углу между ними в треугольнике АВС найти два остальных...

Помогите найти ошибку - C++
#include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;fstream.h&gt; void main() {clrscr(); struct podrozd {char naimenovanie; int...

помогите найти ошибку. - C++
Когда вводишь 0 или -20 например, ERROR не выдает,а что-то непонятное.почему? #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace...

Помогите найти ошибку - C++
Короче написал прогу, в которой вводится строка, и в ней надо заменить первое слово. Всё работает нормально но при выводе конечной строки...

Помогите найти ошибку - C++
Здравствуйте! Я написал код, скомпилировал без ошибок, запустил и у меня ничего не вывелось в консоле, подскажите в чем проблема. Вот код: ...

Помогите найти ошибку. - C++
Задание с подпрограммой, которая упорно не хочет работать и я уже не знаю в чем ошибка.(Данные считываются из текстового файла) Даны...

8
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
26.09.2009, 15:08 #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
#include<stdio.h>
#include<iostream.h>
#include<string.h>
 
int main(int argc, char* argv[])
{
  cout<<"pasalins nelyginius zodzius...:";
  char sak[128];
  gets(sak);
 
  char *sep="\|,<.>/?;;'\|}]{[`!@#$%^&*()-_=+ ";
  char *zodis=strtok(sak,sep);
  int n;// = strlen(zodis);
 
  n = strlen(zodis);
  if (n%2==0)
    cout <<zodis<<" "; //выводим первое слово
 
  while (zodis!= NULL)
  {
    zodis = strtok (NULL, sep);
    if(zodis == NULL)break;
    n = strlen(zodis);
    if (n%2==0)
      cout <<zodis<<" ";
  }
 
  int i;
  cin>>i;
 
return 0;
}
Добавлено через 3 минуты
Вот про strtok
char *strtok(string1,string2);

находит символ в string1
char *string1; строка, содержащая символы
char *string2; множество символов-ограничителей

Описание.

Функция strtok читает строку string1 как множество нуль или более знаков, служащих в качестве ограничителей для символов в string1. Символы в string1 могут отделяться одним или более ограничителем от string2. Символы в string1 разрываются столько раз, сколько вызывается strtok. При первом вызове strtok для заданной строки string1, strtok находит первый символ в string1, пропуская
предыдущие ограничители. Указатель возвращается на первый знак.

Для того, чтобы прочитать следующий символ из string1, функция strtok вызывается вместе с NULL значением для аргумента string1.
Аргумент NULL строки string1 вызывает strtok для поиска следующего знака в предыдущей строке символов. Множество ограничителей может быть различным от вызова к вызову, так как string2 может
принимать любые значения.

Замечание. String1 можно модифицировать вызовами strtok, так как после вызова strtok в string1 вставляется нулевое значение.

Возвращаемое значение.

При вызове strtok первый раз, она возвращает указатель на первый символ в string1. При последующих вызовах в этой же самой строке символов, strtok возвращает указатель на следующий символ в строке. Указатель NULL возвращается, когда нет больше символов. Все символы оканчиваются нулем.
1
Dilan
8 / 8 / 1
Регистрация: 26.09.2009
Сообщений: 65
26.09.2009, 15:33  [ТС] #3
огромное спасибо

Добавлено через 5 минут
кстати народ, я смотрю что мой код выглядит очень топорно, а вот у GAV_13 он красиво расставил пробелы. как они ставятся и где?
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
26.09.2009, 15:42 #4
Dilan, обычно среда сама их расставляет. В какой среде работаешь?
0
Dilan
8 / 8 / 1
Регистрация: 26.09.2009
Сообщений: 65
26.09.2009, 15:47  [ТС] #5
DEV-C++

значит как она их расставляет не вмешиваться? то-есть самому не регулировать?
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
26.09.2009, 16:00 #6
не надо ничего регулировать, после нажатия на ентер среда сама ставит отступ, только вот например при удалении какой-либо части строки нарушается отступ и его необходимо вручную корректировать так чтобы он был таким как и весь код
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
26.09.2009, 16:17 #7
В DEV С++ само не расставляется. Или у меня среда не настроена?
...А вообще обязательных правил нет. Главное, чтобы читать было удобно.

Не скупись на пробелы и комментарии. Логические блоки отделяй друг от друга пустыми строками. Все инструкции блока пиши друг под другом. И пусть они будут сдвинуты на один пробел относительно последней инструкции не блока. Ну то есть

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main () {
 //инструкции блока, логически связанные меж собой. И пробел слева присутствует
 //...
 
 //другие инструкции бока, также логически связанные меж собой
 //
 
 //То же самое. Блок, состоящий из одной инструкции всего 
 return 0;
}
 
//Некоторые объявления
int a;
float b;
Вот ты видишь несколько пустых строк, пробелы слева. int main в данном это последняя предыдущая инструкция не блока. Блок инструкций заключён в фигурные скобки.
Термин "логически" ты всякий раз определяешь сам. Как считаешь нужным, так и обособляй инструкции друг от друга пустыми строками.

Всё это мы наблюдаем в коде GAV_13
Там только фигурные скобки расставлены по-другому, но это не суть важно.
0
easybudda
Модератор
Эксперт CЭксперт С++
9699 / 5649 / 964
Регистрация: 25.07.2009
Сообщений: 10,871
26.09.2009, 17:19 #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
64
#include <stdio.h>
#include <ctype.h>
    
/* Печать слов из предложения, состоящих из чётного и нечётного количества букв */
    
/* подсчёт букв от указателя до первого пробела или знака пунктуации*/
int lettersCount(char *w){
    int count = 0;
    while ( *w != '\0' && !isspace(*w) && !ispunct(*w) ){
        count++;
        w++;
    }
    return count;
}
 
/* указатель на следующее слово в строке, или 0, если слова кончились */
char *nextWord(char *str){
    char *p;
    for ( p = str; *p != '\0' && !isspace(*p) && !ispunct(*p); p++ )
        ;
    if ( *p == '\0' )
        return NULL;
    while ( isspace(*p) || ispunct(*p) )
        p++;
    return ( *p == '\0' ) ? NULL : p;
}
 
/* Печатает одно слово из строки */
void printOneWord(char *s){
    while ( *s && !isspace(*s) && !ispunct(*s) ){
        putchar(*s);
        s++;
    }
}
 
 
int main(){
    char inpbuf[BUFSIZ];
    char *wrd;
    
    while ( fgets(inpbuf, sizeof(inpbuf), stdin) ) {
        wrd = inpbuf;
        printf("Odd: ");
        do {
            if ( lettersCount(wrd) % 2 ){
                printOneWord(wrd);
                putchar(' ');
            }
            wrd = nextWord(wrd);
        } while ( wrd );
        wrd = inpbuf;
        printf("\nEven: ");
        do {
            if ( !(lettersCount(wrd) % 2) ){
                printOneWord(wrd);
                putchar(' ');
            }
            wrd = nextWord(wrd);
        } while ( wrd );
        putchar('\n');
    }
    
    return 0;
}
0
Dilan
8 / 8 / 1
Регистрация: 26.09.2009
Сообщений: 65
26.09.2009, 17:29  [ТС] #9
даа тут вобще космос, если кому не лень step by step объясните
0
26.09.2009, 17:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2009, 17:29
Привет! Вот еще темы с ответами:

Помогите найти ошибку - C++
в чём здесь ошибка #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; int main() { clrscr(); ...

Помогите найти ошибку - C++
#include &lt;iostream&gt; using namespace std; int main() { double a, b; bool state; cout &lt;&lt; &quot; Enter a = &quot;; cin &gt;&gt;...

Помогите найти ошибку - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; void main () {int i,j,s; int ** b=new int*(4) for (i=0;i&lt;4;i++) b=new int for...

Помогите найти ошибку - C++
Программа быстрого возведения в степень.препод сказал, что одна ошибка из-за которой не работает прога.помогите найти #include...


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

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

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