如何摆脱这个程序中的垃圾字符?

How to get rid of garbage characters in this program?

这个程序应该反向打印输入字符串。但是,每次发生这种情况时,我都会收到诸如 0 之类的垃圾字符。为什么要这样做?这是我的代码:

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

int main()
{
    char mattsentence[51];
    mattsentence[50] = '[=10=]';
    gets(mattsentence);
    char mask[sizeof(mattsentence)];
    int i, j;
    j = sizeof(mattsentence);
    for (i = 0; i < sizeof(mask); i++)
    {
        j = j - 1;
        mask[i] = mattsentence[j];
        printf("%c", mask[i]);
    }
    printf("\n");
}

sizeof() 运算符给出数据类型的大小。因此,sizeof(mattsentence) 将为您提供 51 的值。然后,sizeof(mask)再给你51

当您将 sizeof(mask) 用作 for 循环条件时,您基本上会超过实际输入值,从而打印出垃圾值。

这里你要的是用strlen()找出输入字符串的实际有效长度

所以,基本上你需要照顾好

第 1 点:sizeof 替换为 strlen()

要点 2: 使用 gets() 是危险的。请使用 fgets() 而不是 gets().

第 3 点: int main() 应该是 int main(void)。在 main() 的末尾放置一个明确的 return 语句。好的做法。

修改后的代码应该是这样的

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

int main(void)
{
    char mattsentence[51] = {0};                  //always initalize local variables, here it's covering null termination , too.

    fgets(mattsentence, 51, stdin);              //fgets()

    char mask[strlen(mattsentence) + 1];         // one more to store terminating '[=10=]'

    int i = 0, j = 0, k = 0;
    j = strlen(mattsentence);
    k = j;
    for (i = 0; i < k; i++)  // make use of k, don't call `strlen()` repeatedly
    {
        j = j - 1;
        mask[i] = mattsentence[j];
        printf("%c", mask[i]);
    }
    mask[i] = '[=10=]'; // for proper string termination
    printf("\n");
    printf("%s\n", mask);

    return 0;                     //added return statement
}

查看更改后的代码:

int main()
{
    char mattsentence[51];
    mattsentence[0] = '[=10=]'; // initialization

    gets(mattsentence);

    char mask[strlen(mattsentence) + 1]; // +1 for string terminator '[=10=]'

    int i, j;
    j = strlen(mattsentence);
    for (i = 0; i < strlen(mattsentence); i++)  // strlen of original string
    {
        j = j - 1;
        mask[i] = mattsentence[j];
        printf("%c", mask[i]);
    }
    mask[i] = '[=10=]'; // for proper string termination
    printf("\n");
    printf("%s\n", mask);
}

有几个错误:

  • strlen() 应该用于获取字符串的长度
  • for循环应该根据输入字符串来控制,而不是输出字符串
  • 最好使用 fgets() 而不是 gets():这样你可以控制从输入中读取多少字符

你的做法是错误的,因为你反转了整个字符数组,而它只能部分填充。您应该使用在 header <string.h> 中声明的标准 C 函数 strlen 来确定输入字符串的大小。使用 gets 也是不安全的,因为您可以覆盖字符数组之外的内存。它现在被排除在 C 标准之外

这里显示了如何编写程序。

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

#define N   51

int main(void) 
{
    char mattsentence[N] = { '[=10=]' };
    char mask[N] = { '[=10=]' };

    fgets( mattsentence, sizeof( mattsentence ), stdin );

    size_t n = strlen( mattsentence );

    if ( n != 0 && mattsentence[n-1] == '\n' ) mattsentence[--n] = '[=10=]';

    for ( size_t i = 0; n != 0; i++ )
    {
        mask[i] = mattsentence[--n];        
        printf( "%c", mask[i] );
    }

    printf( "\n" );

    return 0;
}

如果进入

Hello, Christiana S. F. Chamon

那么程序输出将是

nomahC .F .S anaitsirhC ,olleH

考虑到要以相反的顺序输出字符串,无需定义第二个字符数组。

如果你只想以相反的顺序输出源字符串,那么程序可以看起来像

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

#define N   51

int main(void) 
{
    char mattsentence[N] = { '[=13=]' };

    fgets( mattsentence, sizeof( mattsentence ), stdin );

    size_t n = strlen( mattsentence );

    if ( n != 0 && mattsentence[n-1] == '\n' ) mattsentence[n-1] = '[=13=]';

    while ( n != 0 )
    {
        printf( "%c", mattsentence[--n] );
    }

    printf( "\n" );

    return 0;
}