Z_Kigh 2021-10-26 18:17 采纳率: 66.7%
浏览 137
已结题

cout<<输出英文字符为乱码是什么情况?

简单说一下程序原理:这个程序本质是建立一个链栈并输出栈内元素,栈内元素为结构体Node,栈顶指针(*S)指向栈顶元素。InitList()是初始化栈顶指针,Push(S,e)是把e放到栈顶。Disp_t()是从栈顶开始向下输出栈内元素,Disp_b()是从栈底开始向上输出栈内元素。

所以假设程序开始运行时输入"abcde\n",那么应该输出一遍"edcba",再输出一遍"abcde"。但实际情况是输出一遍"edcba",再输出一遍"蚢bcde"(我测试了几遍,发现a变"蚢",b变"蚥",c变"蚦",d变"蚫"……)
也就是说Disp_t()这个函数可以正常执行,而Disp_b()输出的第一个字符会变成中文乱码。请问这是为什么?

补充:以上情况是在vc++6.0和CodeBlocks里编译运行时出现的。在runoob和dooccn.com这两个在线编译器里可以正常运行。

在网上看到cout输出中文出乱码的情况,可我这要输出的是英文字符啊。

#include <iostream>
#include<malloc.h>
using namespace std;

typedef struct StackNode
{
    char data;
    StackNode *under;
} Node;

void InitStack(Node *&s);
bool Push(Node *&s,char e);
bool Disp_t(Node *s);
bool Disp_b(Node *s);

int main()
{
    Node *S=NULL;
    char e;

    InitStack(S);

    while(e!='\n')
    {
        cin.get(e);
        if(e!='\n')
            Push(S,e);
    }

    Disp_t(S);
    Disp_b(S);
}

void InitStack(Node *&s)
{
    s=(Node *)malloc(sizeof(Node));
    s->under=NULL;
}

bool  Push(Node *&s,char e)
{
    if(s==NULL)
    {
        cout<<"fail:No such a Stack exists!"<<endl;
        return false;
    }
    if(s->data==0)//因为第一次放入元素时栈顶没有data(s->data==0),所以专门写一个if来给第一次放元素用
    {
        s->data=e;
        return true;
    }
    Node *t;
    t=(Node *)malloc(sizeof(Node));
    t->under=s;
    s=t;
    s->under=t->under;
    s->data=e;
    return true;
}

bool Disp_t(Node *s)
{
    if(s==NULL)
    {
        cout<<"NONE!"<<endl;
        return false;
    }
    while(s!=NULL)
    {
        cout<<s->data;
        s=s->under;
    }
    cout<<endl;
    return true;
}

bool Disp_b(Node *s)
{
    if(s==NULL)
    {
        cout<<"NONE!"<<endl;
        return false;
    }
/*Disp_b()的工作原理是先用t1记录s初始位置(栈顶),然后让s沉到栈底(s->under==t2,此时即s->under==NULL),再让t2上浮一位,指向栈底(t2=s),最后让s回到栈顶(s=t1),再让s开始下一轮下沉。如此循环,每循环一次,t2上浮一位,s下沉的距离也就少一位,直到t2上浮到栈顶的下一位*/
    Node *t1=s,*t2=NULL;
    while(s->under!=t2)
    {
        s=s->under;
        if(s->under==t2)
        {
            cout<<s->data;
            t2=s;
            s=t1;
        }
    }
    cout<<s->data<<endl;
    free(t1);
    free(t2);
    return true;
}



  • 写回答

1条回答 默认 最新

  • 赵4老师 2021-10-26 18:50
    关注

    InitStack最后加一句
    s->data=0;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月3日
  • 已采纳回答 10月26日
  • 修改了问题 10月26日
  • 创建了问题 10月26日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。