反转输入 - 未定义的输出

reversing input - undefined output

本文关键字:输出 未定义 输入      更新时间:2023-10-16
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
  char zahl[255];
  cin>>zahl;
  for(int i=255; i>=0; i--)
    if(zahl[i] != 0)
      cout<<zahl[i];
  cout<<endl;
  return 0;
}

当我输入一些单词时,输入被颠倒,但在此之前和之后都有未定义的表达式。有人可以解释一下原因吗?据我了解,char 数组由插入的表达式填充(从 [0] 开始),其余部分填充"\0"。根据 if 条件,我跳过了"\0"。未定义的表达式从何而来?

泰问候 CS

最初,数组未初始化并包含垃圾。 cin写入输入,后跟单个零终止;数组的其余部分仍然包含垃圾,您的循环在输入之前输出这些垃圾。

您可以指定数组初始化为零:

char zahl[255] = {};

或者你可以测量字符串长度,然后从那里开始:

for (int i=std::strlen(zahl)-1; i >= 0; i--)

或者,更好的是,使用标准库来修复潜在的缓冲区溢出:

std::string zahl;
std::cin >> zahl;
std::copy(zahl.rbegin(), zahl.rend(), std::ostream_iterator<char>(std::cout));

假设输入的单词长度为 255 个字符,您的for loop将运行 256 次。但是,用户输入的长度会有所不同,因此请改为计算长度并在for loop中使用它。

int len = strlen(zahl);

代码现在将是:

#include <iostream>
#include<string.h>
using std::cout;
using std::cin;
using std::endl;
int main(){
char zahl[255];
cin>>zahl;
int len = strlen(zahl);
for(int i=len-1; i>=0; i--)
  if(zahl[i] != 0)
    cout<<zahl[i];
 cout<<endl;
 return 0;
}