2016-10-19 2 views
2

Хорошо, я действительно переживаю K & Книга RC (я знаю, что она устарела и у нее много устаревших вещей, особенно на безопасность, но я просто пытаюсь сделать упражнения). Я играл с упражнением 5-2, где мне нужно реализовать свой собственный strcat с указателями. Мой код выглядит следующим образом:Обучающие C-указатели я не могу понять, почему это не работает (K & R excercise 5-2)

#include <stdio.h> 
#include <stdlib.h> 

char *Strcat(char *string1, const char *string2); 

int main(void){ 
    char string1[100]="hello"; 
    char string2[100]="1234"; 
    printf("%s",Strcat(string1,string2)); 
    return 0; 
} 

char *Strcat (char *string1, const char *string2){ 
    int i=0; 
    char *temp=string1; 
    while(*string1){// move the pointer to find the end of the string 
    ++string1; 
    } 
    while(*string1++=*string2++)//copy string 2 at the end of string 1 
    ; 
    puts(string1);//print string 1 concatenated with string 2 
    return temp;//send back temp pointing to string1 for printing 
} 

Мой вопрос, почему если я пытаюсь напечатать строку1 внутри функции он просто печатает пробелы? Не должен ли он печатать всю строку? Если я печатаю temp, это нормально, поскольку он запускает функцию печати до тех пор, пока не найдет «\ 0», но при попытке со строкой 1 кажется, что она помещена в '\ 0', если указатель не вернется в строку1 [0] position ?. Это, вероятно, что-то простое, но я не могу понять, почему это происходит ...

Любая помощь приветствуется! благодаря!!!

+1

'++ string1'. Вы потеряли начало исходной строки. – kaylum

+0

Hi Kaylum! Спасибо за быстрый ответ! я так думаю, поэтому я думал, что мой мозг по-прежнему думал, что магически функция puts вернет указатель обратно в начало строки1, но имеет смысл, что нет никакого способа узнать, как теперь он полагает, что строка1 начинается с этого что я переехал. Еще раз спасибо! : D – jaferic

+0

использовать 'puts (temp);' вместо этого вот что такое temp для –

ответ

4

++string1 оказывает влияние на переменную, эквивалентную string1 = string1 + 1. Поэтому к тому моменту, когда вы попытаетесь распечатать string1, он больше не указывает на начало исходной строки.

-1

Строка не указывает на начало массива. из-за операций приращения.

+0

Спасибо большое !!! – jaferic

-1

Вы потеряли след указателя string1 как указано на кайлуме. В начале вы назначаете временный указатель temp, чтобы сохранить исходное местоположение string1 - так вот что вам нужно использовать в вашей функции puts в функции Strcat.

puts(temp); 

Кстати, это три линии

while(*string1){// move the pointer to find the end of the string 
++string1; 
} 

можно записать в виде одной строки:

while(*string1++); 
+0

Спасибо artm! да ты прав! нет необходимости в дополнительных линиях в то время, спасибо за наблюдение! :) – jaferic

+0

'while (* string1 ++);': еще один счетчик (минус '' \ 0'') – BLUEPIXY