C程序输出奇怪的字符
C program outputs weird characters
正在尝试在 C:
中打印反向输入#include <stdio.h>
#define MAX_SIZE 100
/* Reverses input */
void reverse(char string[], char reversed[]);
int main() {
char input[MAX_SIZE], output[MAX_SIZE + 1];
char c;
int index = 0;
while ((c = getchar()) != '\n')
{
input[index] = c;
++index;
}
reverse(input, output);
printf("%s\n", output);
}
void reverse(char string[], char reversed[]) {
int rev;
rev = 0;
for (int str = MAX_SIZE - 1; str >= 0; --str) {
if (string[str] != '[=10=]') {
reversed[rev] = string[str];
++rev;
}
}
}
但是有这个奇怪的结果:
输入:
abc
输出:
?:? ????:???:?cba?
输入和输出数组都包含[=11=]
,所以我猜有一些索引越界异常,但我找不到确切位置。谢谢。
对于初学者来说,不清楚为什么数组 input
有 MAX_SZIE
个元素
char input[MAX_SIZE], output[MAX_SIZE + 1];
而数组 output
有 MAX_SIZE + 1
个元素。
在这个循环之后(这是不安全的)
while ((c = getchar()) != '\n')
{
input[index] = c;
++index;
}
数组 input
不包含字符串。
函数revrese
str
的初始值
for (int str = MAX_SIZE - 1; str >= 0; --str) {
没有意义,因为用户可以在数组中输入少于 MAX_SIZE - 1
个字符。
整个程序和函数reverse
可以看成下面的演示程序。
#include <string.h>
#include <stdio.h>
#define MAX_SIZE 100
char * reverse( const char src[], char dsn[] )
{
char *p = dsn + strlen( src );
*p = '[=13=]';
while (p != dsn) *--p = *src++;
return dsn;
}
int main( void )
{
char input[MAX_SIZE], output[MAX_SIZE];
size_t i = 0;
for (int c; i + 1 < MAX_SIZE && ( c = getchar() ) != EOF && c != '\n'; ++i)
{
input[i] = c;
}
input[i] = '[=13=]';
puts( reverse( input, output ) );
}
如果输入例如文本
Hello World!
那么输出将是
!dlroW olleH
注意第一个函数参数应该有限定符const
,因为传递的源字符串在函数内没有被改变。该函数应遵循标准字符串函数的通用约定和 return 指向目标字符串的指针。那就是函数 return 类型 void
没有多大意义。
并且当您处理字符串时,使用无符号类型 size_t
而不是有符号类型 int
的对象作为索引。类型 size_t
是函数 strlen
或运算符 sizeof
.
对于原始字符串的长度,您不应使用 MAX_SIZE
,因为这是容器的总大小,而不是字符串的大小。
另一个问题是输入字符串不是空终止的,因此不可能知道它的长度,除非您跟踪从 stdin
读取的字符数并将其作为参数传递。
解决这两个主要问题(以及其他一些小问题(评论))将使您的代码正常工作:
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
void reverse(const char string[], char reversed[]);
int main()
{
char input[MAX_SIZE], output[MAX_SIZE]; // no need for the extra character
char c;
int index = 0;
while ((c = getchar()) != '\n' && index < MAX_SIZE - 1) // avoid buffer overflow
{
input[index] = c;
++index;
}
input[index] = '[=11=]'; // null terminate the original string
reverse(input, output);
printf("%s\n", output);
}
void reverse(const char string[], char reversed[])
{
int rev;
rev = 0;
// stop condition with the length of the string
for (int str = strlen(string) - 1; str >= 0; --str)
{
reversed[rev] = string[str];
++rev;
}
reversed[rev] = '[=12=]'; // null terminate the reversed string
}