北航计算机机试14排版
输入若干行字符,表示某电影的演职员表,每行只有一个冒号,冒号前面是职位,冒号后面是姓名,要求把各行冒号对齐,删除多余空格后输出。
先输入一个字,表示排版要求的冒号位置该位置号保证比各行冒号前的最大字符数还要大。再输入若干行字符,最多50行,每行最多100个字符,除空格、制表符和回车之外都是有效字符,要求每行的冒号处于格式要求的位置,冒号两边与有效单词之间各有一个空格,冒号前面的单词之间只有一个空格(删除多余的空格和制表符),在冒号左边右对齐,前面全由空格填充,冒号后面的单词之间也只有一个空格,在冒号右边左对齐,最后一个单词后不加空格直接换行。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 50
#define N 100
int main()
{//scanf输入后回车符进入缓冲区,用getchar()缓冲掉
int po;
scanf("%d",&po);
getchar();
//定义二维数组来存放输入的语句
char s[M][N];
//用gets()来输入每行语句,当下一行为空行时,跳出循环
int p=0;
while(p<M)
{
gets(s[p]);
p++;
if(s[p-1][0]=='\0') break;
}
//除去空白行进行循环遍历
for(int i=0;i<p-1;i++)
{
int mao=0,j=0;
int len=strlen(s[i]);//算上了'\0'
//每一句定位:所在位置,记录mao
while(j<len)
{
if(s[i][j]==':')
{ mao=j;
break;
}
j++;
}
//向系统申请两个一维数组的内存,这里注意不要越界,不要越界!!!!!!!
char *job=NULL;
job=(char*) malloc((mao+1)*sizeof(char));
char *name=NULL;
name=(char*) malloc((len-mao)*sizeof(char));
//在把职位赋值的时候需要在赋值完成之后加上'\0'符号,否则会出现连续的空白符
for(j=0;j<mao;j++)
{
job[j]=s[i][j];
}
job[j]='\0';
//将姓名赋值给name数组,因为末尾有换行符,可直接到=len
int k;
for(k=0,j=mao+1;j<=len;j++,k++)
{
name[k]=s[i][j];
}
//按照题目格式,在规定位置为冒号,然后前面的职位右对齐,域宽为冒号位置减一,空白格填充,姓名则左对齐,直接换行
printf("%*s : %-s\n",po,job,name);
//记得释放掉你申请的内存
free(job);
free(name);
}
return 0;
}
/*
error:
1.DAMAGE:After normal block(#****) 在赋值'\0'时忘记申请的内存只有4个,访问越界了
错误源头一,数组访问越界:
大家先看如下一段程序:
int* a = new int[5];
a[5] = 3; // 这儿访问越界了
delete[] a;
在delete[] a;这句代码处将会出现:DAMAGE:After normal block(#93)的错误。
错误源头二:
char* pBuffer = new char[2];
int v = 12345;
memcpy(pBuffer, &v, sizeof(v));
delete[] pBuffer;
正如代码所表示的,我的缓冲区pBuffer有且仅分配了2Bytes的空间,然面我却向它塞了4Bytes的值,显然这是不正确的,DEBUG一下,将出现:DAMAGE:After normal block(#94)的错误。
2.Debug error!Invalid allocation size:4294967295 bytes 同样是越界问题,因为scanf输入后换行符存入缓冲区,导致后续程序出现非法值
也可能是new的问题,在char *p=new char[N];N为之前计算的变量,当N为-1时,会出现错误
3.gets()
当需要循环输入字符串进行处理,同时不知道输入字符串何时终止,所以要判断输入的是否时空行。一开始我想用scanf("%s", str);输入字符串,但是发现当不输入字符直接回车时,scanf()根本不接受,还会一直要你进行输入。后来使用了gets()方法才解决掉这个问题。
可以用以下的方法:
方法一:
当gets()函数没有接受到输入时,它会给字符串一个‘\0’在最前方,
#include <stdio.h>
int main()
{
char str[20];
while(1)
{
gets(str);
if(*str == '\0')
return 1;
printf("%s\n", str);
}
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
int main()
{
char str[20];
while(1)
{
gets(str);
if(strcmp(str, "") == 0)
return 1;
printf("%s\n", str);
}
return 0;
}
*/