为什么put()不打印任何东西

时间:2015-02-11 11:36:23

标签: c++

#include<iostream>
//#include<stdio.h>
using namespace std;

int main()
{
char mystr[20],rev[20];
int i,c=0;
cout<<"Enter a String: ";
gets(mystr);
for (i=0;mystr[i]!='\0';i++);
for (int j=i;j>=0;j--)
{
    rev[c]=mystr[j];
    c++;    
}
cout<<"Reverse is: ";
puts(rev);
return 0;
}

为什么put()不打印任何内容? 如果我使用 for loop 打印字符串 rev 输出是正确的,但为什么 puts 没有给出正确的输出?

3 个答案:

答案 0 :(得分:4)

因为在您的反向操作之后rev的第一个符号是\0,并且puts认为字符串是以空值终止的。因此,它看到第一个字节为空并立即停止。

您可以通过以下方式修改循环:

for (i = 0; mystr[i] != '\0'; i++);
rev[i] = '\0';
for (int j = i-1; j>=0; j--)
{
    rev[c] = mystr[j];
    c++;    
}

答案 1 :(得分:0)

一个问题是rev数组是本地的,并且没有初始化;这意味着不保证结果字符串具有所需的终止\0

您可以在调用rev[c]='\0'之前修复添加puts的内容。

此外,您需要从输入字符串中的{{1>}之前的字符开始,否则输出将以\0'\0'函数开头会停在那儿。

答案 2 :(得分:0)

puts()将\ 0(null)终止的字符串写入标准输出(stdout)并附加换行符('\ n')。由于rev在第0位有\ 0 char,puts()不打印任何内容。

您可以使用下面的代码来反转char数组。

int lenth = strlen(mystr);
int pos = lenth-1;   // one posation before \0 char
int i = 0
for (; i <= pos; i++)
{
    rev[i] = mystr[pos-i];
}
rev[i] = '\0';

int lenth = strlen(mystr);
int start = 0;
int end = lenth-1;      // one posation before \0 char
for (; start < end; start++, end--)
{
    char t;
    t = mystr[start];
    mystr[start] = mystr[end];
    mystr[end] = t;
}

希望它有所帮助!