反转输入字符串

时间:2016-11-12 22:31:17

标签: c string algorithm reverse

我正在尝试捕获用户输入字符串,然后在初始字符串旁边以相反的顺序显示该字符串。我的代码如下:

char str[300], revstring[300];
int i, strlen;



int main(void) {


    printf("Enter a string: ");                 //Prompt user for input string
    gets(str);

    for (i = 0; str[i] != NULL; i++) {          //Get length of string
        strlen += 1;
    }

    for (i = 0; i <= strlen; i++) {
        revstring[i] = str[strlen - i];
    }

    printf("\n\nThe palindrome of your input is %s%s\n\n\n", str, revstring);

    return 0;
}

然而,当我运行程序时,我在初始字符串后看不到任何内容。我来自python背景,所以也许我在太多的python心态中考虑这个,但我觉得这应该工作。

2 个答案:

答案 0 :(得分:1)

该字符串是以空字符结尾的字符串。您正在将空字符复制到反转字符串的开头。这告诉系统他们的字符串终止于第一个字符。

您可以改用此代码。

for (i = 0; i < strlen; i++)
{
    revstring[i] = str[(strlen - 1) - i];
}
revstring[strlen] = 0;

此处仅复制空字符前的字符,然后在末尾添加空字符。

答案 1 :(得分:1)

此循环后

for (i = 0; str[i] != NULL; i++) {          //Get length of string
    strlen += 1;
}

str[strlen]等于终止零'\0'。当revstring等于0时,下一个循环从在数组i的第一个元素中写入零开始。

for (i = 0; i <= strlen; i++) {
    revstring[i] = str[strlen - i];
}

结果没有显示任何内容。

此外,您不应忘记使用终止零附加结果字符串。

考虑到函数gets是不安全的,C标准不再支持它。最好使用标准函数fgets。但是使用它你应该删除附加的新行字符。

该程序可以写成

#include <stdio.h>

#define N   300

int main( void ) 
{
    char str[N], revstring[N];

    printf( "Enter a string: " );

    fgets( str, N, stdin );

    size_t  length = 0;
    while ( str[length] != '\0' && str[length] != '\n' ) ++length;

    if ( str[length] == '\n' ) str[length] = '\0';

    size_t i = 0;
    for ( ; i != length; i++ ) revstring[i] = str[length - i - 1];

    revstring[i] = '\0';

    printf("\n\nThe palindrome of your input is %s%s\n\n\n", str, revstring);

    return 0;
}

它的输出可能看起来像

Enter a string: Hello, Froobyflake

The palindrome of your input is Hello, FroobyflakeekalfyboorF ,olleH