//全局的字符串不初始化默认为每一个元素都是'\0'其实就是0,(这个0当成int输出就输出一个0,但是当成char输出就输出不出来)
//scanf遇到空格算截止,遇到回车也算,但是gets函数遇到空格不算截止,所以要输入的字符串里面有空格可以使用gets函数
#include <stdio.h>
#include <algorithm>
#include <stack>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
char str[101];
int tmp[101];
char ans[101];
int cnt;
int main()
{
while(scanf("%s",&str)!=EOF)
{
memset(ans,0,sizeof(ans));//这里注意不能写memset(ans,' ',sizeof(ans));空格和\0的意义是不同的,' '的ascii码为32而\0就是0,初始化为' '之后会输出一大串空格,很可能导致PE!
cnt=0;
for(int i=0;i<strlen(str);i++)
{
if(str[i]=='(')
{
tmp[cnt]=i;
cnt++;
ans[i]=' ';
}
else if(str[i]==')')
{
if(cnt)
{
cnt--;
ans[i]=' ';
}
else
{
ans[i]='?';
}
}
else
{
ans[i]=' ';//这里要注意要设成空格
}
}
while(cnt--)
{
ans[tmp[cnt]]='$';
}
printf("%s\n",str);
printf("%s\n",ans);
//memset(str,0,sizeof(str));//这里必须memset,scanf()一个字符串的时候,发现最好清空之后再scanf,因为scanf不会先将字符串清零之后再输入,而是直接输入多少覆盖多少,然后在最后加了一个\0。
//注意因为只加了一个\0,所以之后的原来的输入没有被\0覆盖
//比如先向str中scanf一个5长度的字符xxxxx\0,再scanf一个2长度的,则变成yy\0xx\0。(后面的全部都是\0,因为是全局的数组)
//终于知道了,不是这里的问题,是上面for里面用了sizeof,所以把str所有的字符都遍历了(遇到\0也不停止)
//所以这里其实不需要memset,只要上面把sizeof变成strlen就好了
}
////我的实验1:scanf实验,输5个字符的字符串,再输入2个字符的字符串
// scanf("%s",&str);//s
// putchar(str[4]);
//
// scanf("%s",&str);//2
// putchar(str[4]);//第五个字符还在
//
// scanf("%s",&str);//5
// putchar(str[2]);
//
// scanf("%s",&str);//2
// putchar(str[2]);//第3个字符被\0覆盖,所以不在了
//我的实验2:sizeof和strlen实验,输5个字符的字符串,再输入2个字符的字符串
// scanf("%s",&str);//s
// printf("%d\n",sizeof(str));
//
// scanf("%s",&str);//2
// printf("%d\n",sizeof(str));
//
// scanf("%s",&str);//5
// printf("%d\n",strlen(str));
//
// scanf("%s",&str);//2
// printf("%d\n",strlen(str));
//实验中惊人的发现,c字符串应该用strlen,不应该用sizeof!!!只要我的字符串定义的是101,无论怎么输入,sizeof得到的都是101,但是strlen得到的正确的,因为它是找到第一个\0结束的。
//因为!sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
//又例如:
//char str[20]="0123456789";
//int a=strlen(str); //a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。
//int b=sizeof(str); //b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
//sizeof就是c语言中的东西!但是string的长度一定用strlen!!
return 0;
}
//STL的栈,pop()函数没有返回值的
#include <stdio.h>
#include <algorithm>
#include <stack>
#include <string.h>
#include <iostream>
using namespace std;
stack<int> s;
char str[101];
char ans[101];
int main()
{
while(scanf("%s",&str)!=EOF)
{
memset(ans,0,sizeof(ans));//这个是必须的
for(int i=0;i<strlen(str);i++)
{
if(str[i]=='(')
{
ans[i]=' ';
s.push(i);
}
else if(str[i]==')')
{
if(s.empty())
{
ans[i]='?';
}
else
{
ans[i]=' ';
s.pop();
}
}
else
ans[i]=' ';//这一步经常忘记,所以说做题目不能挤着眼做啊,要注意每一步的细节
}
while(!s.empty())
{
//tmp=s.pop();//STL库 中的pop函数好像是没有返回值的,不能这样用!
ans[s.top()]='$';
s.pop();
}
printf("%s\n",str);
printf("%s\n",ans);
}
// //STL的容器栈测试
// s.push(10);
// s.push(20);
// s.push(30);
// cout<<s.top()<<endl;
// cout<<s.size()<<endl;
// cout<<s.empty()<<endl;
return 0;
}