انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: amin-asa در 13 شهریور 1392، 03:02 قظ
-
سلام دوستان
تابع strcpy در این مثال چه کاری انجام می ده؟
#include<stdio.h>
#include<string.h>
int main(void){
char string[81];
int position;
printf("type a string: ");
gets(string);
printf("enter position for ");
printf("delete character: ");
scanf("%d", &position);
strcpy(&string[position], &string[position+1]);
printf("the result string is: ");
puts(string);
return 0;
} // end of main function
-
برنامه رو که اجرا کنید کاملا واضحه. کلا میدونید strcpy چیکار میکنه؟
اگر نمیدونید، اینجا رو ببینید: لینک (http://www.cplusplus.com/reference/cstring/strcpy/)
-
برنامه رو که اجرا کنید کاملا واضحه. کلا میدونید strcpy چیکار میکنه؟
اگر نمیدونید، اینجا رو ببینید: لینک (http://www.cplusplus.com/reference/cstring/strcpy/)
بله میدونم چکاری انجام می ده اما در این مثال از پوینتر استفاده کرده و من اینجاش رو نمی فهمم.
-
برنامه رو که اجرا کنید کاملا واضحه. کلا میدونید strcpy چیکار میکنه؟
اگر نمیدونید، اینجا رو ببینید: لینک (http://www.cplusplus.com/reference/cstring/strcpy/)
بله میدونم چکاری انجام می ده اما در این مثال از پوینتر استفاده کرده و من اینجاش رو نمی فهمم.
رشته رو که قبلا با خط زیر وارد کردید:
gets(string);
مثلا وارد کردید ahmad بعد در خط زیر عنصری که می خواید حذف بشه رو وارد کردید:
scanf("%d", &position);
مثلا وارد کردید ۳.
خوب اصل مشکل شما خط زیره:
strcpy(&string[position], &string[position + 1]);
strcopy آرگومنت دوم خودش رو به آرگومنت اول کپی می کنه که می تونه اشاره گر به یک رشته باشه. با ورودی هایی که ما وارد کردیم میشه:
string[ 3 ]
که میشه حرف a. پس باید حرف a حذف بشه، کاری که تو کد بالا انجام شده این بوده که حرف عنصر بالاتر رو جایگزین حرف عنصر ورودی می کنه، یعنی تو مثال ما عنصر چهارم رو به عصر سوم کپی می کنه و در نتیجه مقدار عنصر سوم از بین میره و مقدار عنصر چهارم جایگزینش میشه. تو این مثلا قرار بود ahmad عنصر سومش که a بود حذف بشه، اینجا d جایگزین a میشه. به همین راحتی. در مورد اشاره گر ها و آرایه ها بگم که این دو تا مثل همدیگن، آرایه به آدرس اولین عنصر خودش اشاره داره درست مثل یک اشاره گر.
-
اولین چیزی که بهتره بدونید اینه که آرایه خودش اشارهگری به عنصر اول آرایه است. به عنوان مثال اگر
int A[5] = {6,7,8,9,10};
آنگاه
A == &A[0]
A[1] == *(A+1)
&A[1] == A+1
این تساوی آخری درک کاملی از اشارهگر به شما میده. فرض کنید
int *B;
در این صورت B به یک بلوک ۴ بایتی (بسته به معماری سیستم) از حافظه اشاره داره و B+1 اشاره به ۴ بایت بعدی (چسبیده به قبلی) داره. حالا اگر از اول
short int *B
در این صورت B به یک بلوک ۲ بایتی (بسته به معماری سیستم) از حافظه اشاره داره و B+1 اشاره به ۲ بایت بعدی (چسبیده به قبلی) داره.
دوم اینکه پایان یک char [] با '\0' مشخص میشه (ولی string این محدودیت رو نداره).
سوال شما: strcpy دو اشارهگر به char رو میگیره مقدار اشارهٔ دومی رو در مقدار اشارهٔ اولی میریزه. بعد به بلوک بعدی هر دو میره و این کار رو تکرار میکنه تا به کاراکتر پایانی '\0' از رشتهٔ دومی برسه. در کد شما، کاراکترهای از مکان position+1 به بعد یکی یکی به مکان قبلی خودشون منتقل میشن و بنابراین کاراکتر مکان position حذف میشه.
-
ممنونم از دوستان
چیزی که من فهمیدم رو بگم خدمت شما:
ارایه و رشته ها که خیلی بهم شبیه هستن و توی زبان سی رشته یه آرایه از کاراکترهاس.
تابع strcpy هم کارش کپی کردن رشته دوم در رشته اول هست. حالا وقتی ما ادرس دو کاراکتر از یه رشته روی می دیم به تابع strcpy همین کار روی برای ما انجام می ده و کاراکتر دوم (ادرس اون) رو به جای کاراکتر اول (باز هم ادرس اون) رشته جایگزین می شه.
پس در اصل ما ادرس رو کپی کردیم ولی چون اینها ادرس رشته هستن وقتی چاپ میکنیم رشته برای ما نمایش داده می شن.