C学习笔记

    在学写《C程序设计语言》中的习题的过程中我犯了很多错误,正是这些错误让我更深的理解C语言。现在就把印象深刻的记录下来,呵呵,吃一堑长一智。

1。编写一个程序,打印输入长度大于5个字符的所有输入行

#include <stdio.h>
#define MAXLINE 1000

int getline(char s[],int maxline);

void main()
{
int i,len;
char line[MAXLINE];

while(1)
{
  if((len=getline(line,MAXLINE))>5)
   for(i=0 ; i<len ; i++)
    printf("%c",line[i]);
}
}

int getline(char s[],int maxline)
{
int i,c;

for(i=0 ; (i<maxline)&&((c=getchar())!=EOF)&&(c!='\n') ; i++)
  s[i]=c;
if(c=='\n')
{
  s[i]=c;
     i++;
}
s[i]='0';
return i;
}

    将字符逐个输入在字符数组中时末尾要输入'\0'。否则在VC++6.0中会在末尾打印出一堆烫,真是不知道会有多烫。

2。编写一个程序,删除每个输入行末尾的0和1,并删除完全是0和1的行

#include <stdio.h>
#define MAXLINE 1000

int getline(char line[],int maxline);

main()
{
int len,j,k;
char line[MAXLINE];

len=getline(line,MAXLINE);
len--;                          /*倒数第一位为'\0' 倒数第二位为'\n',低欧*/
while(len>=0&&((line[len]=='0')||line[len]=='1'))
  len--;
for( k=0 ; k<=len ; k++)
  printf("%c",line[k]);
}

int getline(char line[], int maxline)
{
int i,c;

for(i=0 ; ((i<maxline)&&((c=getchar())!=EOF)&&c!='\n') ; i++)
  line[i]=c;
if(c=='\n')
         ;
line[i]='\0';
return i;
}

正着不行就反着来,另外ASCII表很重要,原来学时咋就没发现呢。

3。编写一个函数setbits(x,p,n,y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。

#include <stdio.h>

int setbits(unsigned x , int p , int n , int y);

main()
{
int x,p,n,y;

scanf("%x",&x);
scanf("%d",&p);
    scanf("%d",&n);
scanf("%x",&y);
printf("%x",setbits(x,p,n,y));
}

int setbits(unsigned x , int p , int n , int y)
{
return (((((~(~0)<<n))&y)<<(p-1))|(((~0<<(p+n-1))|(~(~0<<(p-1))))&x));
}

    return后加表达式挺方便的,不过要这样写太夸张了,算括号都要算半天。位运算挺有用的,尤其结合硬件编程时。

4.编写一个函数escape(s,t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可显示字符分别转换为\n,\t等相应的可显示的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数,在复制过程中将转义字符序列转换为实际字符。

#include <stdio.h>
#define MAXLINE 100

void escape(char s[],char t[]);

void main()
{
char s[MAXLINE],t[MAXLINE];
int c,i;

i=0;

while((c=getchar())!=EOF)
{
  t[i]=c;
  i++;
}
    t[i]='\0';
//printf("%s",t);
escape(s,t);
//printf("%s",t);
printf("%s",s);
}

void escape(char s[],char t[])
{
int i,j;

i=j=0;
while(t[i]!='\0')
{
switch(t[i])
{
case '\n':
  s[j++]='\\';
  s[j]='n';
  break;
case '\t':
  s[j++]='\\';
  s[j]='t';
  break;
default:
  s[j]=t[i];
  break;
}
i++,j++;
}
s[j]='\0';
}
    '\n' '\t'等转义字符存储在字符数组时占一位,在字符数组中输入反斜杠应为‘\\’,另外实验发现格式输入函数scanf("%s",c);在输入时如果使用跳格(制表符)会自动将其转换为‘\0'.因此这里主函数中不能使用格式输入函数。

你可能感兴趣的:(c)