PDA

View Full Version : یه سوال در مورد تابع strcpy



hossein2kk
جمعه 20 آذر 1388, 18:51 عصر
سلام من یه برنامه نوشتم که که حروف تکراری رو حذف می کنه از رشته حالا یه سوال . چرا دو رشته حتما باید Pass by refrence باشن تا کار کنه ؟ من برنامه رو خودم نوشته بودم ولی کار نکرد وقتی به مثال کتاب نگاه کردم این دوتا امپرسند رو دیدم و ...
یه سوال دیگه من وقتی از cin.get استفادهع کردم ارور گرفتم نمی دونم ولی با cin مشکل حل بود .
ممنون

# include <iostream.h>
# include <conio.h>
# include <string.h>

// Wrote By Hossein Moradgholi
// # 4

void remove (char arr [] , int num ){
for (int i = 0 ; i < num ; i++){
bool flag = true ;
for (int j = i+1 ; flag && j < num ; j++){
if (arr [j] == '\0')
flag = false ;
else if (arr [j] == arr [i]){
strcpy (&arr [j] , &arr[j+1]);
}
}
}
}

int main () {
const int num = 30 ;
char string [num];
cin >> string ;
remove (string , num);
cout << string ;
getch();
return 0 ;
}

hossein2kk
جمعه 20 آذر 1388, 19:03 عصر
دوستان یه سوال دیگه گویا من یه باگ دارم تو این برناممم .
ورودی :
sallam
خروجی :
salm
(درست)
ورودی :
sallllam
خروجی :
sallm
(نادرست)
ورودی :
eeeeeeeeeeeeeee
خروجی :
eeee
(نادرست)

ممنون میشم یه همفکری به من بدید .

mortezamsp
جمعه 20 آذر 1388, 19:34 عصر
دلیلش اینه که فقط یک for داری و برنمیگردی دوباره اظافی ها رو پاک کنی.

اول باید یه متغیر بسازی که نشان میدهد در طول یک بار طی گکردن تمام رشته،حد اقل یک کاراکتر مشابه یافت شده. و باید حلقه اول در تابع remove رو آنقدر تکرار کنی که دیگر در یک بار طی کردن رشته، هیچ کاراکتر مشابهی دیده نشود.

hossein2kk
جمعه 20 آذر 1388, 20:04 عصر
میشه یه ویرایشی کد من رو کنید ؟ یا حداقل با کد بگید چون من از توضیحاتتون برداشتی نکردم/

hossein2kk
شنبه 21 آذر 1388, 03:54 صبح
سلام
من مشکلم رو حل کردم کافی بود زمانی که کاراکتر ها رو جابجا می کردم مقدار j رو یک واحد کم کنم چون عبارت های پشت سر هم اسکیپ می شدن اینطوری .
کد اصلاح شده :

# include <iostream.h>
# include <conio.h>
# include <string.h>

// Wrote By Hossein Moradgholi
// # 4

void remove (char arr [] , int num ){
for (int i = 0 ; i < num ; i++){
bool flag = true ;
for (int j = i+1 ; flag && j < num ; j++){
if (arr [j] == '\0')
flag = false ;
else if (arr [j] == arr [i]){
strcpy (&arr [j] , &arr[j+1]);
j-- ;
}
}
}
}

int main () {
const int num = 30 ;
char string [num];
cin >> string ;
remove (string , num);
cout << string ;
getch();
return 0 ;
}
ولی سوال اول من هنوز سر جاشه :

سلام من یه برنامه نوشتم که که حروف تکراری رو حذف می کنه از رشته حالا یه سوال . چرا دو رشته حتما باید Pass by refrence باشن تا کار کنه ؟ من برنامه رو خودم نوشته بودم ولی کار نکرد وقتی به مثال کتاب نگاه کردم این دوتا امپرسند رو دیدم و ...
یه سوال دیگه من وقتی از cin.get استفادهع کردم ارور گرفتم نمی دونم ولی با cin مشکل حل بود .

Salar Ashgi
شنبه 21 آذر 1388, 10:40 صبح
مشکل اصلی شما در این است که تابع strcpy دو تا رشته (حالا یا به شکل آرایه از کاراکترها و یا به شکل

اشاره گر) گرفته و رشته دوم را در اولی کپی میکند ، حال آنکه شما میخواهید دو تا کاراکتر را در هم کپی کنید که

این کار درست نخواهد بود .