2014-02-15 2 views
3

Я пытаюсь написать действительно простую программу, но здесь я не могу найти проблему. Пробовал разные методы, это то, что я пытался в настоящее время:пытается скопировать строки в c, первая буква не копируется

#include <stdio.h> 
void copyStr(char *p, char *h){ 

    int i=0,j=0; 
    int length=0; 
    length=strlen(p); int l=length; 
    for (i=0; i<length; i++){ 
     h[i]=p[l-1]; 
     l--; 
    } 
    char *temp=&h[0]; 
    for (i=0; i<length; i++){ 
     printf("%c",temp[i]); 
    } 


} 
main(){ 

    char p[]="abcde"; 
    char h [sizeof(p)]; 
    copyStr(p,h); 
} 

Когда я копирую эти строки, то первая буква, кажется, не будет скопирована.

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

Любая помощь предоставляется.

EDIT: решена, код в настоящее время работает.

+1

Мне любопытно, что выход из этой второй петли, так как 'p' идет хорошо в землю неопределенного поведения даже оценить гораздо меньше разыменованных , И вы должны проходить 'p, h', а не' & p, & h'. И ваша вторая строка, незаполненная и неопределенная, сдувает ваш первый, уверены ли вы, что эти параметры находятся в правильном порядке? – WhozCraig

ответ

5

Вот код C, чтобы изменить строку,

void reverse(char *string) 
{ 
    int length, c; 
    char *begin, *end, temp; 

    length = strlen(string); 

    begin = string; 
    end = string; 

    for (c = 0 ; c < (length - 1) ; c++) 
     end++; 

    for (c = 0 ; c < length/2 ; c++) 
    {   
     temp = *end; 
     *end = *begin; 
     *begin = temp; 

     begin++; 
     end--; 
    } 
} 
+0

спасибо, использовал его в моем коде. Загрузите его в основное сообщение. – Alan

2

После итерации:

while(*p++=*h++){ 
    ; 
} 

отделок, p будет указывать на завершающий \0 характер копии строки. После этого в этом цикле:

while (p){ 
    printf("%c",p[i++]); 
} 

p будет указывать на этот элемент. После него вы будете печатать символ (т. Е. Вне строки), и этот цикл будет завершаться только тогда, когда p станет 0 (что произойдет после переполнения целого числа). На самом деле программа провалится раньше. Хакерный подход, который вы используете для копирования строк, может быть очень причудливым, но не очень полезным практически во всех случаях. Я предлагаю вам просто использовать функции стандартной библиотеки, такие как strcpy.

+0

Вы правы, я должен использовать регулярную функцию, но присваивание состояний я должен сам по себе. Спасибо. – Alan

3

Много проблем здесь ...

  1. Pass p и h в качестве аргументов, не используйте &p. Переменная p уже является указателем на массив символов. & делает его указателем на указатель.

  2. Вы копируете назад в своей петле, назначая h на p.

  3. Ваш печатный цикл разрушен: условие прекращения должно быть *p не p. Также p уже был добавлен в конец строки вашим кодом копирования.

  4. swap() является вводящим в заблуждение именем. Это не замена двух строк. Он копирует один в другой. Даже позже, когда вы добавляете реверсирование, он все равно реверсирует, а не заменяет.

  5. Вы должны объявить исходный аргумент строки как const. Это обнаружило бы проблему 2 выше.

+0

спасибо. ваша обратная связь очень полезна! – Alan

1

Это код, который работает:

#include <stdio.h> 
void copyStr(char *p, char *h){ 

    int i=0,j=0; 
    int length=0; 
    length=strlen(p); int l=length; 
    for (i=0; i<length; i++){ 
     h[i]=p[l-1]; 
     l--; 
    } 
    char *temp=&h[0]; 
    for (i=0; i<length; i++){ 
     printf("%c",temp[i]); 
    } 


} 
main(){ 

    char p[]="abcde"; 
    char h [sizeof(p)]; 
    copyStr(p,h); 
} 

Ваше мнение очень важно, спасибо.

2

Используйте для реализации STRCPY

char * strcpy(char *strDest, const char *strSrc) 
{ 
    assert(strDest!=NULL && strSrc!=NULL); 
    char *temp = strDest; 
    while(*strDest++ = *strSrc++); // or while((*strDest++=*strSrc++) != '\0'); 
    return temp; 
} 
Смежные вопросы