c语言printf入栈

C语言printf函数压栈问题

i++是后+1,++i是先+1,多个参数的压栈顺序是从最后一个开始的因此,

上边输出的结果是第一行先++i,输出就是2,后边是I++,因此还是2;

第二行,先是i++,输出就是1,之后++i,输出就是2;

第三行,先是i++,输出就是1,之后还是i++,输出还是1,

但是本次取数完毕后,i已经经历了2次+1变成了3了,因此第四行输出的就是3

栈的操作,用c语言?急!

#includestdio.h

#includemalloc.h

#define DataType int

#define MAXSIZE 1024

typedef struct

{

DataType data[MAXSIZE];

int top;

}SeqStack;

SeqStack *Init_SeqStack()//栈初始化

{

SeqStack *s;

s=(SeqStack *)malloc(sizeof(SeqStack));

if(!s)

{

printf(“空间不足\n”);

return NULL;

}

else

{

s-top=-1;

return s;

}

}

int Empty_SeqStack(SeqStack *s)//判栈空

{

if(s-top==-1)

return 1;

else

return 0;

}

int Push_SeqStack(SeqStack *s,DataType x)//入栈

{

if(s-top==MAXSIZE-1)

return 0;//栈满不能入栈

else

{

s-top++;

s-data[s-top]=x;

return 1;

}

}

int Pop_SeqStack(SeqStack *s,DataType *x)//出栈

{

if(Empty_SeqStack(s))

return 0;//栈空不能出栈

else

{

*x=s-data[s-top];

s-top–;

return 1;

}//栈顶元素存入*x,返回

}

DataType Top_SeqStack(SeqStack *s)//取栈顶元素

{

if(Empty_SeqStack(s))

return 0;//栈空

else

return s-data[s-top];

}

int Print_SeqStack(SeqStack *s)

{

int i;

printf(“当前栈中的元素:\n”); 

for(i=s-top;i=0;i–)

printf(“%3d”,s-data[i]);

printf(“\n”);

return 0;

}

int main()

{

SeqStack *L;

int n,num,m;

int i;

L=Init_SeqStack();

printf(“初始化完成\n”);

printf(“栈空:%d\n”,Empty_SeqStack(L));

printf(“请输入入栈元素个数:\n”);

scanf(“%d”,n);

printf(“请输入要入栈的%d个元素:\n”,n);

for(i=0;in;i++)

{

scanf(“%d”,num);

Push_SeqStack(L,num);

}

Print_SeqStack(L);

printf(“栈顶元素:%d\n”,Top_SeqStack(L));

printf(“请输入要出栈的元素个数(不能超过%d个):\n”,n);

scanf(“%d”,n);

printf(“依次出栈的%d个元素:\n”,n);

for(i=0;in;i++)

{

Pop_SeqStack(L,m);

printf(“%3d”,m);

}

printf(“\n”);

Print_SeqStack(L);

printf(“栈顶元素:%d\n”,Top_SeqStack(L));

return 0;

}

c语言printf入栈

c语言入栈出栈,出队入队问题

int pop(seqstack *s,char *x) {

if(s-top == 0) { // 初始化时,s-top = -1,此处以s-top == 0 判断栈为空,有矛盾

printf(“栈空\n”);

return -1;

}

else {

*x = s-c[s-top];

s-top–;

}

return 1;

}

通常,top指的位置是待压入的空结点,所以top == 0时,栈为空,top == MAXSIZE时,栈满,故应该修改初始化函数,建议蟹盖如下:

seqstack *Initstack(void) {

seqstack *s;

s = (seqstack *)malloc(sizeof(seqstack));

s-top = 0;

return s;

}

printf函数参数入栈

这个现象确实存在,但并非在printf()函数中要先执行函数的原因。这可以用下面的代码作试验,证明不是这个原因。

#include

“stdio.h”//。

int

Add1(int

*p){

return(*p+=1);

}

void

main(void){

int

a=1;

printf(“[%d]

[%d]\n”,Add1(a),a);

}

这段代码的运行结果是[2]

[1],说明并没有先执行函数Add1()。而如果把printf(“[%d]

[%d]\n”,Add1(a),a)改为printf(“[%d]

[%d]\n”,a,Add1(a))则结果是[2]

[2]。这个结果也说明printf()函数确实是从参数列表的右端开始执行的。

那么造成题目中的现象是什么原因呢?这是由C/C++对数组的处理机制造成的。printf()函数在处理数组时只把数组首地址压入栈而并不压入数组下标变量的所有内容(因为没有必要,有首地址就可以输出了)。当printf()函数从参数列表的右端开始一项一项运算压栈到最左端的一个参数后,又从左端的控制符开始按控制符指令一项一项对应弹出。对于其他变量来说,压入的是值,原来计算的结果是什么,弹出的就是什么;而题目中的字符串则不然了,先压入首地址p时,尽管p指向的内容是大小写并存的,但接着被strupr(p)变成全大写了,但压入的首地址还是由strupr(p)返回的同一个地址,弹出来输出时这个地址开始的字串已全是大写字母了……

不知说清楚了没有?供参考……

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 17:38:02
下一篇 2024年3月27日 17:49:38

相关推荐

  • c语言listnode,c语言list用法

    C语言中,p=(ListNode*)malloc(sizeof(ListNode))具体什么意思, malloc自身的类型为void *.这里(ListNode *)就是强制转换为ListNode 指针类型。 通过malloc申请sizeof(listnode) 大小的一段连续内存空间,并将该空间地址首地址(指针)强制转换成listnode* 类型,并赋值给…

    2024年5月18日
    3100
  • c语言jpg转换器,c语言在线转换器

    用C语言实现bmp文件转为jpg文件 1、分别对应转换为jpg、bmp、gif、png、tiff格式,当为0ompr时,参数datecess有用,表示转换jpg的质量,取值0-100,数值越小,压缩比越大。 2、步骤1,选择左边最上面的【格式转换】功能,然后点击【添加文件】蓝色按钮,将需要转换格式的bmp图片添加到软件中,批量添加批量转化更省事。 3、在“打…

    2024年5月18日
    4400
  • c语言lunwen,C语言论文参考文献

    为什么要学习c语言论文 C语言功能齐全 C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另 外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑 判断功能也比较强大, 可以实现决策目的。 增强学生学习C语言的信心和动力。选择适合中职教育的教材与教学方式。合理设置教学目标 中职学生普遍基础知识不扎实。 由此可以肯…

    2024年5月18日
    3800
  • c语言读,c语言读取文件

    C语言读取文件数据 首先我们打开需要读取的文件,点击打开左上角文件中的“另存为”。然后我们在弹出来的窗口中点击打开保存类型。然后我们在弹出来的窗口中点击选择“C source file(*.c)”,之后点击保存即可在C语言中读取出来了。 首先需要包含文件输入输出头文件#include stdio.h 打开数据文件,使用fopen()函数:FILE *fp =…

    2024年5月18日
    4200
  • c语言语句看不懂,c语言case语句用法

    初学c语言,四个数排序,用if。中间的几个if语句看不懂,能给我讲讲吗… 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。 (1)if语句中的“表达式”必须用“(”和“)”括起来。(2)else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。 这样最大的个元素会移动到第一个元素的位置上。…

    2024年5月18日
    3700
  • c语言打印数组,C语言打印数组每个元素

    C语言,指针数组:怎么把arr[1]以%d的格式打印出来? 1、而 int p={a,b} 的问题在于,它应该是指向整型指针,而不是整型指针数组。 2、格式说明符:规定了相应输出表列内容的输出格式,以%打头,如%d、%o等 转义字符:用来输出转义字符所代表的控制代码或者特殊字符,比如常用的‘\n、‘\t普通字符:需要原样输出的字符。 3、指针传递的实质就是传…

    2024年5月18日
    5300
  • c语言十进制转化成八进制,c语言编程将十进制数转化为八进制数和十六进制数

    C语言十进制怎么转换八进制,求详细描述,不要编译器运行的结果?_百度… 进制数10转换为8进制的转换过程如下:10/8 = 1 …(余2)1/8 = 0 …(余1) (1/8中的1是上次运算的商)所以10的8进制数为12 在C语言中,用012来表示8进制12,也即在8进制数的前面加一个数字0。 十进制怎么转化为八进制如下:…

    2024年5月18日
    4100
  • c语言中怎么遍历数组,在c语言中可以用来遍历数组元素的循环语句是

    在c语言中可以用来遍历数组元素的循环语句是 有三种循环方式:FOR循环、DO-WHILE循环 、WHILE循环,字符串之间的比较,它有专门的字符串比较函数:strcmp函数。 c[i-1] = c[i-2];} while (–i 0);puts(c);return 0;} 该程序的输出结果是 bcda。程序首先定义了一个长度为6的字符数组 c,…

    2024年5月18日
    4300
  • arp协议研究在vc6.0环境下的c语言,c语言实现arp协议

    简述在VC++6.0环境下运行一个C++源程序的步骤 首先,打开我们的VC++0编程软件,点击左上角的“文件”菜单,并选择“新建”。接着,选择“win32consoleapplication”(win32控制台程序)。然后,填写好工程的名称,以及创建的位置,并点击“确定”按钮。 首先需要点击文件,在出现的下拉框中,选择新建。先新建一个工程,工程栏选择win3…

    2024年5月18日
    3300
  • 五子棋c语言程序,五子棋c语言程序设计如何绘制棋盘

    C语言编一个五子棋的程序 1、-10-29 求一个c语言编写的五子棋游戏代码 1 2012-01-08 编写一个五子棋的游戏程序。 2、从起点到终点画个矩形,然后分成若干等分,垂直或水平划线,至于规格你看看五子棋标准棋盘就能画出来了,然后是工具的问题,Directx或者GDI+都可以画图哦。 3、我建议你采用下子后判断的方式,即玩家1下了一个字后,像该子周围…

    2024年5月18日
    3800

发表回复

登录后才能评论



关注微信