《C和指针》读书笔记(一)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_COLS 20
#define MAX_INPUT 1000
//函数原型
int read_column_numbers( int columns[], int max);
//在其它语言中,这种无返回值的函数叫做过程
void rearrange( char * output, char const * input
          , int n_columns, int const columns[]);

int main( void )
{
           int n_columns;
           int columns[ MAX_COLS ];
           char input[ MAX_INPUT ];
           char output[ MAX_INPUT ];
           //读取该串列标号
          n_columns = read_column_numbers(columns, MAX_COLS ); //C语言中,数组以引用形式进行传递
           //读取,处理和打印剩余的输入行
           while (gets(input) != NULL ) //gets读取一行,丢弃换行符
          {
                   printf( "Original input:%s\n" , input);
                   rearrange(output, input, n_columns, columns);
                   printf( "Rearranged lined:%s\n" , output);
          }
           //字符串是一串以NUL结尾的字符  NUL是‘\0'
           //%d ->以十进制打印  %o ->八进制  %x->十六进制  %g->浮点数  %c->打印字符 %s->打印字符串
           return EXIT_SUCCESS ;
          system( "pause" );
           return 0;
}

//读取类标号,如果超过规定范围则不予理会
int read_column_numbers( int columns [], int max )
{
           int num = 0;
           int ch;
           //读取列标号,如果读取的数小于0则停止
           //1.num<max防止溢出 2.columns[num] >= 0 防止输入出现负值
           //&& 逻辑与  也有人叫做短路与 
           //scanf("%d", &columns[num]) == 1 scanf每次从标准输入读取一个值,如果转换失败,返回0,成功返回1
           while (num < max &&scanf( "%d" , & columns [num]) == 1
                   && columns [num] >= 0)
                   num += 1;

           //确定已经读取的行号为偶数个,因为他们是以成对的形式出现的
           if (num % 2 != 0)
          {
                   puts( "Last column number is not paired." ); //输出一行
                   exit( EXIT_FAILURE );
          }

           //丢弃该行中包含最后一个数字的那部分内容
           //EOF是一个整形值
           while ((ch = getchar()) != EOF &&ch != '\n' )
                   ;
           return num;

          
          
}


void rearrange( char * output , char const * intput ,
           int n_columns , int const columns [])
{
           int col;
           int output_col;
           int len;
          len = strlen( intput );
          output_col = 0;

           //处理每队列标号
           for (col = 0; col < n_columns ; col += 2)
          {
                    int nchars = columns [col + 1] - columns [col] + 1;
                    //如果输入行结束或输出行数组已满,就结束任务
                    if ( columns [col] >= len ||
                             output_col == MAX_INPUT - 1)
                              break ;

                    //如果输出行数据空间不足,支付至可以容纳的数据
                    if (output_col + nchars> MAX_INPUT - 1)
                   {
                             nchars = MAX_INPUT - output_col - 1;
                   }

                    //复制相关的数据
                    //strncpy第一个参数:目标字符串 第二个:源目标串 第三个 复制的字符数
                   strncpy( output + output_col, intput + columns [col],
                             nchars);
                   output_col += nchars;
          }
           output [output_col] = '\0' ;
}


//scanf()函数需要注意的地方
//1.标量参数前加&
//strcpy 和strcat 1.第一个参数不能使字符串常量 因为字符串常量不能改变 2.需要注意目标字符串要有足够的空间
//否则会出现问题
//strchr 在字符串中进行搜索 第一个参数:字符串  第二个:字符  返回第一次出现的位置

  

你可能感兴趣的:(《C和指针》读书笔记(一))