切一根绳子?

时间:2018-03-06 17:52:59

标签: c string pointers

int i;
char str[100];
char *p;

puts("Enter a string:");
gets(str);
system("cls");

p = &str;
    for (i = 0; i < strlen(str); i++) {
        printf("\n%s", p);
        ++p;
        //printf("\n%d %d", i, *p);
    }

    for (i=2*i+1; i > strlen(str); i--) {
        printf("%s\n", p);
        p--;
        //printf("\n%d %d", i, *p);
    }

该程序的输出是

"alpine
lpine
pine
ine
ne
e
e
ne
ine
pine
lpine
alpine".

如何让它显示&#39; e&#39;只有一次,而不是两次?

2 个答案:

答案 0 :(得分:2)

你的代码问题是,当你p到达字符串的最后一个字符时,你会在开始递减之前再次递增它。因此,如果您在第一个单e之后仔细查看,则还会打印空字符串。

试试这个。

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

int main() {
   int i;
    char str[100];
    char *p;

    puts("Enter a string:");
    gets(str);

    p = &str;
    for (i = 0; i < strlen(str); i++) {
        printf("\n%s", p);
        ++p;
    }
    p--;
    for (; i > 1; i--) {
        p--;
        printf("\n%s", p);
    }
}

答案 1 :(得分:0)

#include<stdio.h>

int main() 
{
    int i;
    char str[100];
    char *p;

    puts("Enter a string:");
    gets(str); // input word alpine, has six letters
    system("cls");

    p = &str;
    for (i = 0; i < strlen(str); i++) {
        printf("\n%s", p);
        ++p;
    } // At the end of this i equals 6

    // p is now pointing at a l p i n e \0 
    //                                   ^ here at the null terminator

    // In the following loop you set i to 13, this will loop 7 times.
    // First you print the null terminator \0 and \n
    // Then the 6 characters of alpine backwards

    for (i = 2 * i + 1; i > strlen(str); i--) 
    {
        printf("%s\n", p);
        p--;
    }
}

我会留给你找出解决方案。