• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Решение Задачи Связанной С Работой С Символами

  • Автор темы vladis222
  • Дата начала
V

vladis222

Уважаемые пользователи!!! Помогите пожалуйста. Я в этом году поступил в универ на специальность программирование. Но вот мы делаем лабы и застрял на выполнении лабы, связанной с символьной строкой. Тут задание : нужно найти в строке слово, которое является изображением числа кратного 5. Метод я знаю: используется функция strtok которая делит строку на слова. А вот как написать решение на си, не знаю,и не понимаю работу функции strtok в языке си. хоть и читал методичку. Вся надежда на вашу помощь.
Вот кусок кода, который я написал до функции:

C++:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include<locale>
#define N 80
int main()
{setlocale(LC_ALL, "Rus" );
char L[N]; int k,i;
char *p; char *str1;
printf("Введите строку L=%d",L);
for(i=0;i<N;i++)
scanf ("%c",&L[i]);
p=strtok( // но тут видимо неправильно)))
 
R

rrrFer

в цикле выделяешь слова. В каждом слове смотришь на последний символ - если это '0' или '5' - то слово нашел, иначе переходи к следующему слову пока не кончится строка.
 
V

vladis222

в цикле выделяешь слова. В каждом слове смотришь на последний символ - если это '0' или '5' - то слово нашел, иначе переходи к следующему слову пока не кончится строка.
Спасибо, но а как воспользоваться и ввести функцию strtok на языке си для этой проги?
 
L

lazybiz

При первом вызове выделяет первое слово из строки (str) и возвращает указатель на него (если была ошибка то NULL), при этом разделителями являются символы: пробел, запятая и точка.
word = strtok( str, " ,." );

При последующих вызовах так же возвращает слова до тех пор пока они не закончатся. Если word == NULL, значит слова закончились.
word = strtok( NULL, " ,." );
 
V

vladis222

При первом вызове выделяет первое слово из строки (str) и возвращает указатель на него (если была ошибка то NULL), при этом разделителями являются символы: пробел, запятая и точка.
word = strtok( str, " ,." );

При последующих вызовах так же возвращает слова до тех пор пока они не закончатся. Если word == NULL, значит слова закончились.
word = strtok( NULL, " ,." );
<!--shcode--><pre><code class='код'>#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include<locale>
#define N 200
int main()
{setlocale(LC_ALL, "Rus" );
char L[N]; int k,i,word;char *M;char*p;
M=&L[0];
printf("Введите строку L размером меньше 200 символов=%d",L);
gets(L);
p=strtok(M, " , ");
printf(p);
p = strtok('\0', ", ");
if(p)
{printf("|%s", p);
while(p);
}
for(i=0;i<N;i++)
{
if(L=0||L=5)
word++;
}
printf("Кол-во слов=%d",word);

}[/CODE]
вот такой код я написал, но все равно есть ошибки, можете, пожалуйста, указать на них?
 
L

lazybiz

1. А ты в курсе, что NULL и '\0' это не одно и тоже?
2. Для выделения каждого нового слова нужно вызывать strtok.
3. Зачем указывать два пробела: p=strtok(M, " , "); ?
4. После этой: M=&L[0]; записи, M начинает отражать L. Какой в этом смысл?
 
V

vladis222

Конечно маловероятный вариант, но все же) :
C++:
#include <iostream>

using namespace std;

int main()
{
void *	p_A;
void *	p_B;

int		l_A = sizeof(  0 ) * 100;
int		l_B = sizeof( '\0' ) * 100;

p_A = new char [l_A];
p_B = new char [l_B];

cout << "l_A = " << l_A << endl;
cout << "l_B = " << l_B << endl;

return 0;
}
кстати, а что мне нужно переписать в коде, чтобы он работал для моего задания?
 
V

vladis222

C++:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include "cstdlib"
#include<locale>
#define N 200
int main()
{setlocale(LC_ALL, "Rus" );
char L[N]; 
int k,i,word,r;
//char *M;
char*p;
//M=&L[0];
system("CLS");
//clrscr();
printf("Введите строку L размером меньше 200 символов\n");
gets(L);
p=strtok(L, " ");
printf("%s \n",p);
do
{ 
p = strtok(NULL, " ");
printf("%s \n",p);
}while(p!=NULL);

/*проверка слова р на кратность 5*/
for(i=0;i<N;i++)
{ 
if( p<strlen(p))
if(p[i]==0||p[i]==5)
word++;
}
printf("Количество слов кратных 5=\n",word);
for(i=0;i<N;i++)
{ 
if( *p=strlen(p))
if(L[i]!=0||L[i]!=5)
word=0;
}
printf(" Cлов кратных 5 нет \n");
getch();
return 0;
}


вот я написал код к проге(разбил строку на слова, теперь после проверки на кратность пяти оно находит какие-то ошибки, можете пожалуйста подсказать,какие?)
 
L

lazybiz

теперь после проверки на кратность пяти оно находит какие-то ошибки, можете пожалуйста подсказать,какие?)
Ты пишешь программу, компилируешь, компилятор выдает ошибки, а ты спрашиваешь у нас какие ошибки он тебе выдает??!!!

Что такое: слово, которое является изображением числа кратного 5 ?!
 
W

Whatka

вот кусок твоего кода:
C++:
 /*проверка слова р на кратность 5*/
for(i=0;i<N;i++)
{ 
/*!!!!!!!!!!!!!*/ if( p<strlen(p))	/*!!!!!!!!!!!!*/  
if(p[i]==0||p[i]==5)
word++;
}
ты же объявил p как сhar!
ты вообще знаешь что такое strlen????и как работает??
....
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!