C++ - Указатели и Строки

Ответить
Noxon
Сообщения: 2
Зарегистрирован: 15 июн 2008, 13:18

15 июн 2008, 13:33

Всем доброго времени суток!
Есть вот такое задание:

Найти место первого появления в строке S1 какого-либо символа из строки S2 и, если строка S1 не содержит символов строки S2, возвращает значение –1.

Я написал небольшой код, но он не работает. Я пока в С ночичёк...Задано сделать с помощью указателей.
Буду очень признателен за любую помощь. Работаю в Visual Studio 6.0. Спасибо. Код прилагаю.

Код: Выделить всё

#include <iostream.h>
int look(char *stroka1,char *stroka2,int n);
int look(char *stroka1,char *stroka2,int n) 
{
	 for (int i=0;*stroka1!='\0';*stroka1,i++) 
	 {
		 for (int j=0;*stroka2!='\0';*stroka2++,j++)
		 {
			
			if (*(stroka1+=i)==*(stroka2+=j)) 
			{
				n+=i;
			}
		 }
	 
	 }

	return n;

}	

int main()

{ 
	int n=-1;
	char stroka1[]="owertmyui";
	cout<<stroka1<<endl;
	char stroka2[]="qaznscmut";
	cout<<stroka2<<endl;
	cout<<look(stroka1,stroka2,n)<<" "<<endl;

	return 0;
}
Vasilisk
Сообщения: 111
Зарегистрирован: 13 фев 2004, 18:43

15 июн 2008, 19:49

char * str1 = "ascdefghijklmnoprstuvwxyz\0";
char * str2 = "opr\0";

int pomogite_menya_otchislyaut(char * where,char * what){

for(int i=0; i < strlen(where); i++){
for(int j=0; j < strlen(what); j++){
if(*(where + i) == *(what + j)) return i;
}
}
return -1;
}

:: printf("Первое вхождение в %d позиции\n",:: pomogite_menya_otchislyaut(str1,str2));


Без комментариев разберёсси? :) В stdlib есть стандартная функция pomogite_menya_otchislyaut, которая делает то, что написано в программе выше. Я на полном серьёзе, у неё только имя другое. А какое - я и сам не помню уже...
Noxon
Сообщения: 2
Зарегистрирован: 15 июн 2008, 13:18

15 июн 2008, 21:16

Vasilisk,
Огромное спасибо! Во всём разобрался=)
Всё было проще чем я думал=))
я про strlen=)
Vasilisk
Сообщения: 111
Зарегистрирован: 13 фев 2004, 18:43

15 июн 2008, 23:45

Вообще, такие вещи каноничнее делать через while, т.е. строку (раз она гарантированно заканчивается нулём) можно перебирать и так:

char * p1 = str1;
char * p2 = str2;
char c1, c2;


while(c1=*str1++){
//с1 - очередной символ str1
str2 = p2; //чтобы всегда с начала str2
while(c2=*str2++){
//с2 - очередной символ str2
if(c1 ==c2){
//но вернуть-то требуют позицию от начала строки, а не адрес!
return str2 - p1;
}
}
}

А можно и ещё короче:
char * p1 = str1;
char * p2 = str2;

while(*str1){
//с1 - очередной символ str1
str2 = p2; //чтобы всегда с начала str2
while(*str2){
//с2 - очередной символ str2
if(*str1++ ==*str2++){
//но вернуть-то требуют позицию от начала строки, а не адрес!
return str2 - p1;
}
}
}

... и никаких strlen. strlen - это "паскалевский" стиль программирования, в нём-то строки нулём не заканчиваются. :p
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

17 июн 2008, 13:44

Кхм...
А воспользоваться стандартной ф-ей strcspn нельзя?
Если я правильно понял задание и описание ф-ии, то вся процедура проверки будет состоять всего из одного ее вызова.

Код: Выделить всё

[b]strcspn[/b]
Find a substring in a string.

size_t strcspn( const char *string, const char *strCharSet );

[b]Return Value[/b]

Each of these functions returns an integer value specifying the length of the initial
segment of string that consists entirely of characters not in strCharSet. If string begins
with a character that is in strCharSet, the function returns 0. No return value is reserved
to indicate an error.

[b]Remarks[/b]

The strcspn function returns the index of the first occurrence of a character in string that
belongs to the set of characters in strCharSet. Terminating null characters are included in
the search.
Vasilisk
Сообщения: 111
Зарегистрирован: 13 фев 2004, 18:43

17 июн 2008, 13:49

Дык, внимательно читаем задание - "написать strspn самому" :p

P.S. Спасибо, я вспомнил название этой функции...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

17 июн 2008, 14:18

Vasilisk писал(а):Дык, внимательно читаем задание - "написать strspn самому" :p
В упор не увидел ничего про "написать strspn самому".
Перечитал задание еще раз. Там написано:

Есть вот такое задание:
Найти место первого появления в строке S1 какого-либо символа из строки S2 и, если строка S1 не содержит символов строки S2, возвращает значение –1.

Vasilisk писал(а):P.S. Спасибо, я вспомнил название этой функции...
Думаете, я помню? Я открываю MSDN, набираю там, например, strcmp (т.е. название фунции, которое помню), и внизу иду по ссылке "String Manipulation Routines". Там уже смотрю описание ф-й в списке.
Vasilisk
Сообщения: 111
Зарегистрирован: 13 фев 2004, 18:43

17 июн 2008, 21:28

Я - поступаю так же. Но я уже давно не пишу в MS Windows :( А линуксовым манам до MSDN довольно далеко. Впрочем, я и на stdc тоже давно не пишу... Но - циклы ещё помню хорошо :) :) :)
Arthas
Сообщения: 1
Зарегистрирован: 11 май 2010, 13:11

11 май 2010, 13:17

Вот те исправленая прога.

#include <iostream>
using namespace std;
int look(char *str, char *std);
int look(char *str, char *std)
{
for (int i=0;*(str+i)!='\0';i++)
{
for (int j=0;*(std+j)!='\0';j++)
{

if (*(str+i)==*(std+j))
{
return i;

}
}

}
return -1;


}

int main()

{
char str[]="owertmyui";
cin>>str;
cout<<str;
cout<<"\n";
char std[]="qaznscmut";
cin>>std;
cout<<std;
cout<<"\n";
cout<<look(str,std)<<" ";


return 0;
}
Аватара пользователя
rrrFer
Сообщения: 224
Зарегистрирован: 07 сен 2008, 14:15
Контактная информация:

11 май 2010, 15:19

где же ты был 2 года назад? ))
Приглашаю на свой блог о программировании: pro-prof.com
Ответить