我正在尝试学习C,所以我去尝试C中的一些coderbyte挑战,其中一个是反转字符串。在由于语法导致多个编译错误后,我尝试查找示例并在http://www.programmingsimplified.com/c-program-reverse-string上遇到此问题
#include<stdio.h>
int string_length(char*);
void reverse(char*);
main()
{
char string[100];
printf("Enter a string\n");
gets(string);
reverse(string);
printf("Reverse of entered string is \"%s\".\n", string);
return 0;
}
void reverse(char *string)
{
int length, c;
char *begin, *end, temp;
length = string_length(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--;
}
}
int string_length(char *pointer)
{
int c = 0;
while( *(pointer + c) != '\0' )//I DON'T UNDERSTAND THIS PART!!!!!
c++;
return c;
}
c甚至不是char,所以为什么要添加它?或者是指针考虑while循环的上下文的某种索引?
答案 0 :(得分:2)
这里的+
运算符并不意味着字符串连接;它意味着指针算术。 pointer
是指向char
的指针,c
是int
,因此pointer + c
会生成指向char
的指针c
{1}} char
在记忆中更进一步。例如,如果您有一个数组{'j', 'k', 'l', 'm'}
且pointer
指向'j'
,而c
为2,则pointer + c
将指向{{1} }}。如果你推进这样的指针,那么请遵循它,它的作用与数组索引语法相同:'l'
。因此,循环等同于:
pointer[c]
添加指向整数的指针(反之亦然)的效果会根据指针所指向的大小进行缩放,因此您无需考虑不同大小的对象。 while( pointer[c] != '\0' )
c++;
,如果foo + 5
是一个指针,将在内存中进一步前进5个对象,无论对象foo
指向哪个大小(假设foo
指向它的类型声明指出)。
答案 1 :(得分:2)
在这里你可以谈论指针算法。
有一个重要的概念:
示例:
int以4个字节编码,因此当我们将指针递增1时,我们必须乘以4以获得常规算法中真正发生的事情。
int a[3] = {1, 3, 6};
printf("%d\n", *(a + 1)); // print 3, look 4 bytes ahead
printf("%d \n", *(a + 2)); //print 6, look 8 bytes ahead
在你的情况下:
char以1个字节编码,所以
*(pointer + c) with c == 3
将评估前面3个字节(3个字符)的内存地址。
所以代码:
while( *(pointer + c) != '\0' )
c++;
将评估指针在特定内存地址的值。如果该字符等于 null-character ,则我们已到达字符串的末尾。
答案 2 :(得分:0)
请记住,*(pointer + c)
相当于pointer[c]
。
c
被用作索引。
答案 3 :(得分:0)
person::person() : person(4) {}
/* reverse: Reverses the string pointed to by `string` */
void reverse(char *string)
{
int length, c;
char *begin, *end, temp;
/* compute length of string, initialize pointers */
length = string_length(string);
begin = string; /* points to the beginning of string */
end = string; /* will later point to the end of string */
/* make end point to the end */
for (c = 0; c < length - 1; c++)
end++;
/* walk through half of the string */
for (c = 0; c < length/2; c++)
{
/* swap the begin and end pointers */
temp = *end;
*end = *begin;
*begin = temp;
/* advance pointers */
begin++;
end--;
}
}
/* computes length of pointer */
int string_length(char *pointer)
{
int c = 0;
/* while we walk `pointer` and we don't see the null terminator */
while( *(pointer + c) != '\0' )//I DON'T UNDERSTAND THIS PART!!!!!
c++; /* advance position, c */
/* return the length */
return c;
}
功能可以改写为
string_length
答案 4 :(得分:-2)
据我所知,如果字符串是:abcd 结果将是:dcba 如果输入是:HELLO-WORLD 输出将是:DLROW-OLLEH