Недостаток в примере программы strcpy - PullRequest
0 голосов
/ 19 февраля 2010

Я использую следующий код для копирования содержимого строки в другую строку.Используются две логики: одна с циклом while (с комментариями) работает, а другая нет (как = at).

Пожалуйста, помогите мне выявить изъян в этом коде.advance


#include<stdio.h>
#include<conio.h>
main()
{
    char *s="SourceString";
    char *t="TargetString";

    void print(char *s);
    void strcopy(char *s,const char *t);
    print(s);

    strcopy(s,t);
    print(s);
    getch();
}

void strcopy(char *as,const char *at)
{
    /*while((*as=*at)!='\0')    // working
    {
        as++;
        at++;
    }  */
    as=at;    //not working
}

void print(char *s)
{
    printf("\n Printing the Contents:");
    for(;*s!='\0';s++)
        printf("%c",*s);
    printf("\n END");
}

Все говорят, что строки передаются по значению, а не по адресу.Но я передаю адрес строк в вызывающей функции, а в вызываемой функции использую указатели.Пожалуйста, уточните, я новичок в указателях

Ответы [ 5 ]

2 голосов
/ 19 февраля 2010

Назначение строки следующим образом:

char *s="SourceString";

использует память только для чтения, поэтому изменение содержимого приведет к неопределенному поведению. Использование массивов, вероятно, будет работать так, как вы думали.

char s[]="SourceString";
char t[]="TargetString";

В вашем примере вы просто играете с локальными переменными, которые уничтожаются при возврате функции strcpy.

Вы можете попробовать что-то вроде этого:

void strcopy2(char **s, char **t) //<--- pointers to pointers, ouch!
{
    *t = *s; //<--- Assign the value of the pointer who's address was passed.
}

int main(void)
{
    char *s = "SourceString";
    char *t = "TargetString";

    printf("%s\n", s);
    strcopy2(&s, &t);  //<--- pass address of pointers!
    printf("%s\n", t);

}

Я предпочитаю использовать массивы char, хотя я манипулирую строками.

2 голосов
/ 19 февраля 2010

Когда as является аргументом функции, запись as=anything; перестает действовать, когда функция завершается, поскольку ее аргументы перестают существовать (как и ее локальные переменные). Вы не изменяете строку, вы только изменяете ячейку памяти, которая временно содержала адрес строки и которая все равно должна была быть освобождена.

Ваш вопрос действительно является вопросом об указателях. Возможно, вы можете найти уже заданный вопрос в StackOverflow о указателях в C или C ++, которые вам помогут.

1 голос
/ 19 февраля 2010

Работающая версия использует цикл для копирования по одному символу за раз.

Версия, которая не просто копирует одну переменную указателя в другую. Эта операция не влияет ни на что другое в программе. as = at просто изменяет одну локальную переменную и возвращает. Так что это не оптимизация, которую вы можете сделать.

0 голосов
/ 19 февраля 2010

Вот две ошибки с вашим нерабочим кодом.

1) Ваше утверждение as = at копирует локальную переменную в другую локальную.Назначение теряется, как только вы выходите из функции.
2) Возможно, вы пропускаете все, что , как указано до назначения,

Другая потенциальная проблема в использовании - это то, что обычно в C мыскажем target <- source </em>, чтобы вы использовали в качестве и в в обратном направлении.

0 голосов
/ 19 февраля 2010

С as=at; вы копируете локальную переменную в локальную переменную. Не берите в голову, что они являются указателями - они являются копиями в стеке функции, поэтому ваши изменения не видны вне функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...