Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个使用指针反转字符串的C程序是如何工作的?_C - Fatal编程技术网

这个使用指针反转字符串的C程序是如何工作的?

这个使用指针反转字符串的C程序是如何工作的?,c,C,请你一步一步地给我解释一下这个C程序使用指针反转字符串的算法好吗 #include <stdio.h> int main() { char str[50]; char rev[50]; char *sptr = str; char *rptr = rev; int i=-1; printf("Enter any string : "); scanf("%s",str); while(*sptr) {

请你一步一步地给我解释一下这个C程序使用指针反转字符串的算法好吗

#include <stdio.h>

int main()

{
    char str[50];
    char rev[50];
    char *sptr = str;
    char *rptr = rev;

    int i=-1;
    printf("Enter any string : ");
    scanf("%s",str);

    while(*sptr)
    {
        sptr++;
        i++;
    }

    while(i>=0)
    {
        sptr--;
        *rptr = *sptr;
        rptr++;
        --i;
    }


    *rptr='\0';
    printf("Reverse of string is : %s",rev);
    return 0;
}
#包括
int main()
{
char-str[50];
char rev[50];
char*sptr=str;
char*rptr=rev;
int i=-1;
printf(“输入任何字符串:”);
scanf(“%s”,str);
而(*sptr)
{
sptr++;
i++;
}
而(i>=0)
{
sptr-;
*rptr=*sptr;
rptr++;
--一,;
}
*rptr='\0';
printf(“字符串的反面是:%s”,rev);
返回0;
}
此循环

while(*sptr)
{
    sptr++;
    i++;
}
通过递增
sptr
对字符串进行迭代,直到达到字符串的零终止字符。循环后,
i
将对应于字符串的长度。然后在这个循环中:

while(i>=0)
{
    sptr--;
    *rptr = *sptr;
    rptr++;
    --i;
}

i
将字符复制到
rptr
中的
sptr
指向的字符之前,然后减小sptr,使其指向上一个字符。

此while循环计算大小<当表达式的计算结果为0时,code>while终止。C字符串由null终端终止,当转换为整数时,null终端为0。所以这个循环一直运行,直到它检测到一个C字符串的结尾,如null终止符==0所示。sptr和我向下移动字符串,我计算字符数,sptr递增以指向下一个字符。最后,
sptr
指向输入字符串的末尾

 while(*sptr)
 {
     sptr++;
     i++;
 }
在下一个循环中,虽然还剩下字符(记住,这个循环之前的i是字符串的大小),但我们将
sptr
向后移动到字符串下方(最后一个循环将其指向字符串的末尾)。与此同时,另一个
rptr
正在通过另一个字符串向前移动。语句
*rptr=*sptr
从向后移动的
sptr
复制到向前移动的
*rptr
,从而反转字符串

while(i>=0)
{
    sptr--;
    *rptr = *sptr;
    rptr++;
    --i;
}

魔术就在这个循环中:

while(i>=0) // while there are more letters... (i was previously set to the number of letters)
{
    sptr--;  // decrement source pointer (points to end of source string
    *rptr = *sptr; // copy char
    rptr++; // increment target pointer
    --i; // decrement number of chars remaining
}

事实上,相当直截了当

使用调试器一步一步地检查它,同时密切监视所有变量。它不起作用。例如,
while(i=0)
根本不会循环。对我来说,它工作得很好(用gcc编译),它通过从字符串的末尾到开头遍历字符串来反转字符串,每次复制一个字符。但你应该先搜索一下。“这里面充满了相同的问题。”道格特。老实说,这听起来很合理。好吧,假设这是第一次被问到的“合法问题”。(我可以反驳这一点,但无论如何。)但考虑到这个问题实际上有几十个副本,唯一可以放心假设的是OP在发布这个问题之前没有做过任何研究。哇。事态迅速升级。6秒以下3票。我不明白为什么这个答案会比其他答案好那么多。老实说,我也不…简单地说,内联解释。@StoryTeller
静态内联
,mouhahaha。。。