切一根绳子?

问题描述 投票:-2回答:2
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".

如何让它只显示一次“e”而不是两次?

c string pointers
2个回答
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);
    }
}

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--;
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.