C语言 反转字符串的程序截断结果

ltskdhd1  于 2023-03-12  发布在  其他
关注(0)|答案(3)|浏览(93)

我是一个新手程序员。我用C写了这个程序,它接受一个字符串输入,然后反转它。然而,当它打印结果时,它给出了一些垃圾值和字符串本身的截断版本。我不知道出了什么问题,有线索吗?

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

    char s[50] = "";

    int start;
    int tmp = 0;
    int len;
    int i;
    int end;

    printf("Enter String: ");

    fgets(s, 99, stdin);

    len = strlen(s);
    printf("String Length is: %i\n", len);

    end = len - 1;

    for (start = 0; start <= end; start++)
    {
            tmp = s[end];
            s[end] = s[start];
            s[start] = s[tmp];
            end--;
    }
    printf("Reversed String Is: ");

    for (i = 0; i <= len; i++)
            putchar(s[i]);

}
例如:字符串“a man my son”返回“nam a”。
我尝试改变增量值,但没有效果。
我还添加了一个printf语句,用于打印字符串长度,显示正确的值。

j8yoct9x

j8yoct9x1#

正如在注解中已经指出的,您有两个拼写错误,第一个错误是字符数组s是用50元素声明的

char s[50] = "";

但是在fgets的调用中

fgets(s, 99, stdin);

指定了值99而不是50
第二点是在这份声明中

s[start] = s[tmp];

赋值运算的右操作数不正确。您必须改为

s[start] = tmp;

还有其他的问题,例如函数fgets可以在输入字符串后添加一个新的行字符'\n',在反转字符串之前应该将其从字符串中删除。
同样,一般来说,你应该使用size_t类型来代替int类型来表示字符串长度,它是strlen函数的返回类型。
程序可以看起来像下面这样。

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

int main( void )
{
    char s[50] = "";

    printf( "Enter String: " );

    fgets( s, sizeof( s ), stdin );

    size_t n = strcspn( s, "\n" );

    s[n] = '\0';

    printf( "String Length Is: %zu\n", n );

    if ( n != 0 )
    {
        for ( size_t i = 0; i < --n; i++ )
        {
            char c = s[i];
            s[i] = s[n];
            s[n] = c;
        }
    }

    printf( "Reversed String Is: \"%s\"\n", s );
}

程序输出可能如下所示

Enter String: a man my son
String Length Is: 12
Reversed String Is: "nos ym nam a"

如果您不想更改保持字符串长度的变量n,那么for循环可以如下所示

if ( n != 0 )
    {
        for ( size_t i = 0, j = n; i < --j; i++ )
        {
            char c = s[i];
            s[i] = s[j];
            s[j] = c;
        }
    }

请注意,您应该始终在使用变量的最小作用域中声明变量。
我也建议你看看我对以下问题的回答。我希望它对你有用。试图扭转C字符串,但它不工作

nbysray5

nbysray52#

这将按您的预期工作。请参阅我的//评论。

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

int main(void)
{
    char s[50];

    int start;
    int tmp = 0;
    int len;
    int i;
    int end;

    printf("Enter String: ");

    fgets(s, 99, stdin);

    len = strlen(s);
    printf("String Length is: %i\n", len);

    end = len - 1;

    for (start = 0; start <= end/2; start++)  //go halfway.
    {
            tmp = s[end];
            s[end] = s[start];
            s[start] = tmp;                   //use VALUE not index
            end--;
    }
    printf("Reversed String Is: ");

    for (i = 0; i <= len; i++)
            putchar(s[i]);
    putchar('\n');   //add this to get newline
}
axr492tv

axr492tv3#

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

int main(void) {
    
    char s[50] = "";
    char d[50] = "";

    long int start;
    long int len;
    long int end;

    printf("Enter String: ");

    fgets(s, 99, stdin);

    len = strlen(s);
    printf("String Length is: %ld\n", len);

    end = len - 1;

    long int index = end;
    for (start = 0; start <= end; start++)  {
            d[start] = s[index];
            index--;
    }
    printf("Reversed String Is: %s\n", d);
}

相关问题