انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: pointer در تابع strcpy  (دفعات بازدید: 2078 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
pointer در تابع strcpy
« : 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
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
پاسخ : pointer در تابع strcpy
« پاسخ #1 : 13 شهریور 1392، 03:35 ق‌ظ »
برنامه رو که اجرا کنید کاملا واضحه. کلا می‌دونید strcpy چیکار می‌کنه؟
اگر نمی‌دونید، اینجا رو ببینید: لینک

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : pointer در تابع strcpy
« پاسخ #2 : 13 شهریور 1392، 03:55 ق‌ظ »
برنامه رو که اجرا کنید کاملا واضحه. کلا می‌دونید strcpy چیکار می‌کنه؟
اگر نمی‌دونید، اینجا رو ببینید: لینک

بله میدونم چکاری انجام می ده اما در این مثال از پوینتر استفاده کرده و من اینجاش رو نمی فهمم.
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
پاسخ : pointer در تابع strcpy
« پاسخ #3 : 13 شهریور 1392، 10:37 ق‌ظ »
برنامه رو که اجرا کنید کاملا واضحه. کلا می‌دونید strcpy چیکار می‌کنه؟
اگر نمی‌دونید، اینجا رو ببینید: لینک

بله میدونم چکاری انجام می ده اما در این مثال از پوینتر استفاده کرده و من اینجاش رو نمی فهمم.
رشته رو که قبلا با خط زیر وارد کردید:
  gets(string);
مثلا وارد کردید ahmad بعد در خط زیر عنصری که می خواید حذف بشه رو وارد کردید:
  scanf("%d", &position);مثلا وارد کردید ۳.
خوب اصل مشکل شما خط زیره:
  strcpy(&string[position], &string[position + 1]);
strcopy آرگومنت دوم خودش رو به آرگومنت اول کپی می کنه که می تونه اشاره گر به یک رشته باشه. با ورودی هایی که ما وارد کردیم میشه:
string[ 3 ]که میشه حرف a. پس باید حرف a حذف بشه، کاری که تو کد بالا انجام شده این بوده که حرف عنصر بالاتر رو جایگزین حرف عنصر ورودی می کنه، یعنی تو مثال ما عنصر چهارم رو به عصر سوم کپی می کنه و در نتیجه مقدار عنصر سوم از بین میره و مقدار عنصر چهارم جایگزینش میشه. تو این مثلا قرار بود ahmad عنصر سومش که a بود حذف بشه، اینجا d جایگزین a میشه. به همین راحتی. در مورد اشاره گر ها و آرایه ها بگم که این دو تا مثل همدیگن، آرایه به آدرس اولین عنصر خودش اشاره داره درست مثل یک اشاره گر.
« آخرین ویرایش: 13 شهریور 1392، 10:39 ق‌ظ توسط NBism »

آفلاین امید توانا

  • Hero Member
  • *
  • ارسال: 981
  • جنسیت : پسر
پاسخ : pointer در تابع strcpy
« پاسخ #4 : 13 شهریور 1392، 01:18 ب‌ظ »
اولین چیزی که بهتره بدونید اینه که آرایه خودش اشاره‌گری به عنصر اول آرایه است. به عنوان مثال اگر
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 حذف می‌شه.

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : pointer در تابع strcpy
« پاسخ #5 : 14 شهریور 1392، 01:51 ب‌ظ »
ممنونم از دوستان

چیزی که من فهمیدم رو بگم خدمت شما:

ارایه و رشته ها که خیلی بهم شبیه هستن و توی زبان سی رشته یه آرایه از کاراکترهاس.

تابع strcpy هم کارش کپی کردن رشته دوم در رشته اول هست. حالا وقتی ما ادرس دو کاراکتر از یه رشته روی می دیم به تابع strcpy همین کار روی برای ما انجام می ده و کاراکتر دوم (ادرس اون) رو به جای کاراکتر اول (باز هم ادرس اون) رشته جایگزین می شه.

پس در اصل ما ادرس رو کپی کردیم ولی چون اینها ادرس رشته هستن وقتی چاپ میکنیم رشته برای ما نمایش داده می شن.
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *