c语言中如何只清屏后半部分保留前半部分?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中如何只清屏后半部分保留前半部分?相关的知识,希望对你有一定的参考价值。
请看如下程序:如何才能把前半部分的字母abcdefg保留,只清屏后半部分的符号&&&&&&&&&&&&&?
谢谢!!!
#include<stdio.h>int main()
printf("abcdefg\n");
printf("&&&&&&&&&&&&&\n");
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#define stacksize 100
//---字符栈的基本操作----------------------------------
typedef char datatype1;
typedef struct //定义字符栈,用数组表示
datatype1 data[stacksize];
int top;
seqstack1;
void initstack1(seqstack1 *s)//置空栈
s->top = -1;
int stackempty1(seqstack1 *s)//判栈空
return s->top == -1;
int stackfull1(seqstack1 *s)//判栈满
return s->top == stacksize-1;
void push1(seqstack1 *s, char x)//进栈
if(stackfull1(s)) return ;
++s->top;
s->data[s->top] =x;
char pop1(seqstack1 *s)//退栈
if(stackempty1(s)) return NULL;
s->top--;
return s->data[s->top+1];
char stacktop1(seqstack1 *s)//访问栈顶元素
if(stackempty1(s)) return NULL;
return s->data[s->top];
//---整数栈的基本操作----------------------
typedef double datatype2;
typedef struct//定义数栈,用数组表示
datatype2 data[stacksize];
int top;
seqstack2;
void initstack2(seqstack2 *s)//置空栈
s->top = -1;
int stackempty2(seqstack2 *s)//判栈空
return s->top == -1;
int stackfull2(seqstack2 *s)//判栈满
return s->top == stacksize-1;
void push2(seqstack2 *s, double x)//进栈
if(stackfull2(s)) return ;
++s->top;
s->data[s->top] =x;
double pop2(seqstack2 *s)//退栈
if(stackempty2(s)) return NULL;
s->top--;
return s->data[s->top+1];
double stacktop2(seqstack2 *s)//访问栈顶元素
if(stackempty2(s)) return NULL;
return s->data[s->top];
char proceed(char a,char b)//判断运算符的优先级,a为栈内运算符,b为栈外运算符
int i,j;
char c[9][9]=
,
,
,
,
,
,
,
,
;
for(i=1;i<7;i++)if(c[i][0]==a)break;
for(j=1;j<7;j++)if(c[0][j]==b)break;
return c[i][j];
double transform(char *s,int *i)//字符型数据转化为双精度型数据
int j=0,n;
double a[10],sum1=0,sum2=0;
for(;isdigit(s[*i]);(*i)++)
a[j++]=s[*i]-'0';
n=j;
for(j=0;j<n;j++)
sum1=(sum1+a[j])*10;
sum1=sum1/10;
if(s[(*i)]=='.')
*i=*i+1;
for(j=0;isdigit(s[*i]);(*i)++)
a[j++]=s[*i]-'0';
for(j=j-1;j>=0;j--)
sum2=(sum2+a[j])/10;
return sum1+sum2;
double operate(double a,char r,double b)//运算函数
switch(r)
case'+':return a+b;break;
case'-':return a-b;break;
case'*':return a*b;break;
case'/':return a/b;break;
case'^':return pow(a,b);break;
default:printf("error");
;
double evalexpres(char *s)//求表达式值的函数
char ch,r;
int i=0;
double a,b,num;
seqstack1 *stack1;
seqstack2 *stack2;
stack1=(seqstack1*)malloc(sizeof(seqstack1));//创建字符栈
stack2=(seqstack2*)malloc(sizeof(seqstack2));//创建数栈
initstack1(stack1);
push1(stack1,'#');
initstack2(stack2);
ch=s[i];
while(ch!='#'||stacktop1(stack1)!='#')//扫描表达式
if(isdigit(ch))//如果是‘0’~‘9’,转换为整形,进数栈
num=transform(s,&i);
push2(stack2,num);
ch=s[i];
else
switch (proceed(stacktop1(stack1),ch))
case'<'://栈内符号优先级低,栈外符号进栈
push1(stack1,ch);
ch=s[++i];
break;
case'='://脱括号并接收下一个字符。
pop1(stack1);
ch=s[++i];
break;
case'>'://退栈并将运算结果入数栈。
r=pop1(stack1);
b=pop2(stack2);
a=pop2(stack2);
printf("计算步骤:\n%.3f%c%.3f=%.3f\n",a,r,b,operate(a,r,b));//输出运算步骤
push2(stack2,operate(a,r,b));
break;
case'x': printf("原表达式%s有误,请检查:\n",s);break;
//switch
//else
//while
return stacktop2(stack2);
main()
double num;
char s[stacksize];
printf("\t\t\t| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|\n");
printf("\t\t\t|^_^这是我的计算器^_^|\n");
printf("\t\t\t|____________________|\n");
printf("\t\t支持加,减,乘,除,指数及括号运算.\n");
printf("\t\t数据可以为双精度类型的任意数\n");
printf("\t\t请输入表达式,并以#结束:\n");
scanf("%s",s);
while(s[strlen(s)-1]!='#')
printf("输入有误!请重新输入:\n");
scanf("%s",s);
num=evalexpres(s);
printf("%s=%.3f\n",s,num);
getchar();
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快! 参考技术A 把后半句话去掉不就行了
将动态数组的前半部分复制到后半部分在 C 中失败?
【中文标题】将动态数组的前半部分复制到后半部分在 C 中失败?【英文标题】:Copying first half of dynamic array into second half failed in C? 【发布时间】:2022-01-15 23:11:24 【问题描述】:我想将我的动态数组的前半部分复制到同一数组的后半部分,但这里的输出是从 ptr[100] 到 ptr[200] 9.90。我想我编码的一切都很好,但我不知道问题出在哪里。你能帮帮我吗?
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
int i;
int j;
double * ptr = calloc(100, sizeof(double));
if (ptr == NULL)
return 0;
for(i = 0; i < 100; i++)
ptr [i] = i / 10.0;
for(i = 0; i < 100; i++)
printf("ptr[%d] = %.2f\n", i, ptr[i]);
if (realloc(ptr, 200) == NULL)
return 0;
for (i = 0; i < 100; i++)
for (j = 100; j < 201; j++)
ptr [j] = ptr[i];
for (j = 100; j < 201; j++)
printf("ptr[%d] = %.2f\n", j, ptr[j]);
return 0;
【问题讨论】:
realloc(ptr, 200)
应该是realloc(ptr, 200 * sizeof *ptr)
我试过了。它不工作
【参考方案1】:
您在 realloc 上分配不足。您没有为 200 个双打腾出足够的空间,因此尝试访问 ptr[x]
对于 x > 99 的值是未定义的行为。此外,realloc
可能会移动内存,因此您需要将新值分配回 @987654323 @。例如:
ptr = realloc(ptr, 200 * sizeof *ptr);
if( ptr == NULL )
perror("realloc");
exit(1);
在此之后,访问ptr[200]
是未定义的行为。您需要将循环索引的范围缩小到for( j = 100; j < 200; j++ )
【讨论】:
【参考方案2】:你正在覆盖每个副本
for (i = 0; i < 100; i++) // for every item in the first half
for (j = 100; j < 201; j++) // into every cell
ptr [j] = ptr[i];
应该是
for (i = 0; i < 100; i++)
ptr [i+100] = ptr[i];
第 2 期:
您没有分配足够的内存:将 realloc(ptr, 200)
更改为 realloc(ptr, 200 * sizeof(double))
【讨论】:
非常感谢。它现在正在工作,但我不明白为什么要覆盖它。 您对它们不同步但嵌套的循环感到困惑,因此对于 i 的每一步,j 都在 100 到 199 的整个范围内以上是关于c语言中如何只清屏后半部分保留前半部分?的主要内容,如果未能解决你的问题,请参考以下文章