如何摆脱这个程序中的垃圾字符?
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;
}
这个程序应该反向打印输入字符串。但是,每次发生这种情况时,我都会收到诸如 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;
}