Member 13013165 Ответов: 2

Что я не могу напечатать без ссылки на указатель?


Это попытка вопроса В K&R C p. 107. Код работает нормально, но я не понимаю, почему де-ссылочный указатель
*s
не может быть напечатан. Он просто печатает пустой файл, в то время как следующий printf работает нормально.

Спасибо!

Что я уже пробовал:

#include <stdio.h>

void strnecpy(char *s,char *t,int n);

int main()
{
    int i=0;
    char a[200]="This is String one";
    char b[20]="String two";
	
    strnecpy(a,b,10);
    while(a[i]!='\0'){
		putchar(a[i]);
		i++;
	}
        
    return 0;
}


void strnecpy(char *s,char *t,int n){
	int i;
	while(*s!='\0')
		s++;
	for(i=0;i<=n;i++){ 
		*s++=*t++;
		printf("s is %c",*s);
		printf("pointer counter is %d",s);
		putchar('\n');
	}
}

2 Ответов

Рейтинг:
16

Jochen Arndt

Это потому что s был увеличен в предыдущей строке и указывает на очищенное содержимое памяти при печати символа. Компилятор установил символы за пределами начальной строки в нули.

Просто представьте себе, что происходит, когда выполняется первая итерация цикла:

/* s is pointing to the NULL terminating char of "This is String one" here 
 at offset 18 */

/* Splitting this into single lines to show what happens */
/* *s++=*t++; */

/* Copies 'S' (first char of "String two") to s */
*s = *t;
/* Increment pointers */
s++;
t++;
/* s points now to the next position (offset 19) which contains a NULL */
printf("s is %c",*s);

Если вы хотите напечатать скопированный символ, сделайте это перед увеличением указателя (используйте *t затем) или получить доступ к этому индексу:
printf("s will be %c",*t);
*s++ = *t++;
printf("s is %c",*(s-1)); /* or s[-1] */


Рейтинг:
0

Patrice T

Цитата:
Код работает нормально, но я не понимаю, почему де-ссылочный указатель *s не может быть напечатан.

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

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.