PDA

Просмотр полной версии : C++ - Указатели и Строки



Noxon
15.06.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
15.06.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
15.06.2008, 21:16
Vasilisk,
Огромное спасибо! Во всём разобрался=)
Всё было проще чем я думал=))
я про strlen=)

Vasilisk
15.06.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
17.06.2008, 13:44
Кхм...
А воспользоваться стандартной ф-ей strcspn нельзя?
Если я правильно понял задание и описание ф-ии, то вся процедура проверки будет состоять всего из одного ее вызова.


strcspn
Find a substring in a string.

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

Return Value

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.

Remarks

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
17.06.2008, 13:49
Дык, внимательно читаем задание - "написать strspn самому" :p

P.S. Спасибо, я вспомнил название этой функции...

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

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


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

Vasilisk
17.06.2008, 21:28
Я - поступаю так же. Но я уже давно не пишу в MS Windows :( А линуксовым манам до MSDN довольно далеко. Впрочем, я и на stdc тоже давно не пишу... Но - циклы ещё помню хорошо :) :) :)

Arthas
11.05.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
11.05.2010, 15:19
где же ты был 2 года назад? ))