求字符数组的长度函数:sizeof(char*),strlen(char*)
头文件
char str[20]=”0123456789”;
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
求字符串的长度函数:length(string),size(string)
字符串转化为字符数组:string.c_str()
输入一串包含空格的字符串至字符数组
gets(char*); //注意:PAT中C++语言使用gets()是无法通过编译的,因此不能使用gets
通过使用读入优化(不过这样比较麻烦,之间通过操作字符串的方式会比较简洁):
void read(char a[257],int *len){
char k=getchar();
while(k!='\n'){
a[(*len)++]=k;
k=getchar();
}
}
吸收换行符
getchar()
输入整个字符串至字符串
string ans;
用getline(cin,ans);可以
输出整个字符串
用cout<<ans;
最初自己的做法(用字符数组,考虑麻烦并且还有一个测试点始终过不了)
大致思路没有问题,从最后一列往前一个字符一个字符进行比较,若遇到不相同的字符就暂停
#include<cstdio>
#include<cstdlib>
#include<iostream>
void read(char a[257],int *len){
char k=getchar();
while(k!='\n'){
a[(*len)++]=k;
k=getchar();
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char arr[100][257];
int N,b[100],sum=0;
bool flag=true;
scanf("%d",&N);
getchar();
for(int i=0;i<N;i++){
int len=0;
int *l=&len;
read(arr[i],l); //指针变量作为函数参数
b[i]=len-1;
}
while(1){
char a=arr[0][b[0]--];
for(int i=1;i<N;i++){
if(a!=arr[i][b[i]--]){
flag=false;
break;
}
}
if(flag){
sum++;
}else{
if(sum){
for(int j=b[0]+2;j<=b[0]+1+sum;j++){
printf("%c",arr[0][j]);
}
}else{
printf("nai");
}
break;
}
}
return 0;
}
看了算法笔记中代码,进行改进,可将字符数组进行反转后再从第一列开始往后比较,相对来说会更容易,少犯细节错误。
#include<cstdio>
#include<cstdlib>
#include<iostream>
void read(char a[257],int *len){
char k=getchar();
while(k!='\n'){
a[(*len)++]=k;
k=getchar();
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char arr[100][257];
int N,b[100],sum=0,minlen=270;
bool flag=true;
scanf("%d",&N);
getchar();
for(int i=0;i<N;i++){
int len=0;
int *l=&len;
read(arr[i],l); //指针变量作为函数参数
b[i]=len-1;
if(minlen>len)minlen=len;
}
for(int i=0;i<N;i++){ //字符串反转
for(int j=0;j<minlen/2;j++){ //一定要记得除2(不然就跟没反转毫无区别)
char temp=arr[i][j];
arr[i][j]=arr[i][b[i]-j];
arr[i][b[i]-j]=temp;
}
}
for(int t=0;t<minlen;t++){
char a=arr[0][t];
for(int i=1;i<N;i++){
if(a!=arr[i][t]){
flag=false;
break;
}
}
if(flag){
sum++;
}else{
break;
}
}
if(sum){
for(int j=sum-1;j>=0;j--){
printf("%c",arr[0][j]);
}
}else{
printf("nai");
}
return 0;
}
发现一个比较有意思的事:
一个测试点过不了:
if(flag){
sum++;
}else{
if(sum){
for(int j=sum-1;j>=0;j--){
printf("%c",arr[0][j]);
}
}else{
printf("nai");
}
break;
}
}
return 0;
更改为如下(自以为这两者没差),结果测试点过了,个人觉得是因为在输出之后再做break操作所导致,有待进一步思考。
if(flag){
sum++;
}else{
break;
}
}
if(sum){
for(int j=sum-1;j>=0;j--){
printf("%c",arr[0][j]);
}
}else{
printf("nai");
}
return 0;
继续改进,看了大佬的代码,发现用字符串处理起来会方便很多
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,len,slen;
string ans;
scanf("%d",&n);
getchar();
getline(cin,ans);
len=ans.length();
reverse(ans.begin(),ans.end());
for(int i=1;i<n;i++){
string s;
getline(cin,s);
slen=s.length();
reverse(s.begin(),s.end());
len=min(len,slen);
for(int j=0;j<len;j++){
if(ans[j]!=s[j]){ //字符串也可以通过下标取出对应位置的单个字符
len=j;
break;
}
}
}
ans=ans.substr(0,len);
reverse(ans.begin(),ans.end());
if(len==0){
printf("nai");
}else{
cout<<ans;
}
return 0;
}