指针的循环反转,最后一个字符?

时间:2018-03-26 20:52:28

标签: c

在显示指针的结果时遇到问题。

我试图显示这个词,并且每次都消除最后一个字符,也就是说,我试图做的是与此相反的

#include <stdio.h>

int main() {
    char str[128] = "Some Text";
    char *p;
    int i =0;

    for (p = str; *p ; p++) {
        printf(" value => %s \n ",p);
    }

    return 0;
}

输出

 value => Some Text 
  value => ome Text 
  value => me Text 
  value => e Text 
  value =>  Text 
  value => Text 
  value => ext 
  value => xt 
  value => t 

我试过这个,但我没有得到它

value => Some Text 
value => Some Tex
value => Some Te
value => Some T
value => Some 
value => Som
value => So
value => S

3 个答案:

答案 0 :(得分:1)

问题的代码通过调整字符串开始的位置(for循环中的p++)来改变字符串的开头。要更改字符串的结尾,我们通过用NUL(0)字节覆盖最后一个字符来调整字符串结束的位置。我们通过从字符串末尾(i)向开头移动索引(strlen(str))来实现此目的。

#include <stdio.h>

int main() {
    char str[128] = "Some Text";
    char *p;
    int i;

    for (i = strlen(str); i>0; i--) {
        str[i] = 0;
        printf(" value => %s \n ",str);
    }

    return 0;
}

答案 1 :(得分:1)

您需要做的第一件事是删除格式字符串中换行符之后的空格字符。

    printf(" value => %s \n",p);

您需要做的下一件事是继续移动终止空字符。为此,您需要存储指向终止空字符的指针。

以下是您的计划的更新版本:

#include <stdio.h>
#include <string.h>

int main() {
    char str[128] = "Some Text";
    char *p = str;
    char *end = str + strlen(str);

    // The *(--end) = '\0' is the crucial part.
    // It decrements end so it points to the previous character
    // and changes its value to the null character.
    for ( ; end > p; *(--end) = '\0')
    {
       printf(" value => %s \n",p);
    }

    return 0;
}
  

你能用典型的“for”和索引放一些例子吗?

不确定

这是比第一个更简化的一个。

for ( ; end > p; --end)
{
   *end = '\0';
   printf(" value => %s \n",p);
}

这是一个使用“典型”for循环的方法。

for ( int i = 0; i < len; ++i)
{
   p[len-i] = '\0';
   printf(" value => %s \n",p);
}

答案 2 :(得分:0)

另一种解决方案,使用一些不同的技术:

#include <stdio.h>

int main() {
    char str[128] = "Some Text";
    int i = strlen(str) + 1 ;

    while( i --> 1 ) {
        printf("value => %.*s \n", i, str );
    }

    return 0;
}