كيف يقوم strcpy() بنسخ سلسلة إلى مصفوفة عندما لا يمكنك تغيير عنوان المصفوفة؟

StackOverflow https://stackoverflow.com//questions/12695021

سؤال

لذا تقوم strcpy أساسًا بتعيين عنوان الوسيطة الثانية للوسيطة الأولى، ولكن كيف تفعل ذلك باستخدام مصفوفة باعتبارها الوسيطة الأولى؟كما هو الحال في برنامجي، حاولت تغيير عنوان المصفوفة ولكن لسوء الحظ لن يتم تجميعها.لذلك اضطررت إلى اللجوء إلى إنشاء متغير مؤشر حرف لتعيين القيمة المرجعة للأحرف الكبيرة.هل هناك شيء سوء فهمي؟

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char string[20];
char *Capitalize(char *str)
{
    int i;
    char *temp;
    temp = malloc(sizeof(char)*(int)(strlen(str)+1));
    for(i = 0;i < strlen(str);i++)
    {
        if(*(str+i) >= 'a' && *(str+i)<= 'z')
            *(temp+i) = *(str+i) - 32;
        else
            *(temp+i) = *(str+i);
    }
    *(temp+i) = '\0';
    return temp;
}
int main(void)
{
    string word;
    printf("Enter word to capitalize: ");
    scanf("%19s",word);
    word = Capitalize(word);
    printf("%s",word);
    return 0;
}
هل كانت مفيدة؟

المحلول

strcpy() يقوم بعمل نسخة، تمامًا كما يوحي الاسم.من القانوني تمامًا نسخ سلسلة إلى مصفوفة.

عند إجراء تهيئة لمجموعة مثل:

char myarr[] = "hello";

أنت في الواقع تقوم بنسخ الأحرف إلى المصفوفة.

يبدو أنك تخلط بين المصفوفات والمؤشرات (انظر هنا لسبب ما، لا يمكنك معاملتهم بنفس الطريقة)

نصائح أخرى

في لغة C، تأهيل صفيف بالاسم بدون مفهرس، يعادل تحديد مؤشر إلى عنوان الذاكرة للعنصر الأول في الصفيف، ولهذا السبب يمكنك تمرير صفيف كمعلمة إلى وظائف مثل strcpy.

char * strcpy ( char * destination, const char * source );

strcpy سيتم نسخ أي سلسلة من الأحرف يتم العثور عليها، بدءًا من عنوان الذاكرة المحدد بواسطة source, ، إلى عنوان الذاكرة المحدد بواسطة destination, ، حتى يتم العثور على حرف فارغ (0) (يتم نسخ هذا الحرف الفارغ أيضًا إلى المخزن المؤقت للوجهة).

لا يتم تعديل قيم العنوان المحددة في المعلمات, ، فهي تحدد فقط مكان النسخ في الذاكرة وأين سيتم النسخ.من المهم أن destination يشير إلى مخزن مؤقت للذاكرة (يمكن أن يكون مصفوفة أحرف أو كتلة من الذاكرة مطلوبة عبر malloc) بسعة كافية لتناسب السلسلة المنسوخة، وإلا سيحدث نقص في المخزن المؤقت (ستكتب أحرفًا بعد نهاية المخزن المؤقت الخاص بك) و قد يتعطل برنامجك أو يتصرف بطريقة غريبة.

أتمنى أن أكون واضحا وأن لا أربكك أكثر في شرحي ;)

الشيء الذي يبدو أنه في عداد المفقودين هو أنه في سلاسل C / C ++ صفائف، في معظم النواحي العملية المعلنة

giveacodicetagpre.

و

giveacodicetagpre.

هو نفس الشيء، كل STRCPY يقوم بنسخ الأحرف في ذاكرة الوجهة، سواء تم تخصيص تلك الذاكرة كصفيف (يفترض في المكدس) أو المؤشر (يفترض على كومة الكومة)؛ لا تحدث فرقا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top