获取字符串的N段子串

来源:互联网 发布:根域名有什么用 编辑:程序博客网 时间:2024/05/19 11:20

例如输入:

0 3  5  7 -1

input:0123456789

output:0123567

程序分析:

输入两段字串间隔如:(0 3) (5 7) -1是结束符


/*** This program reads input lines from the standard input and prints** each input line, followed by just some portions of the lines, to** the standard output.**** The first input is a list of column numbers, which ends with a** negative number.  The column numbers are paired and specify** ranges of columns from the input line that are to be printed.** For example, 0 3 10 12 -1 indicates that only columns 0 through 3** and columns 10 through 12 will be printed.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#defineMAX_COLS20/* max # of columns to process */#defineMAX_INPUT1000/* max len of input & output lines */intread_column_numbers( int columns[], int max );voidrearrange( char *output, char const *input,    int n_columns, int const columns[] );intmain( void ){intn_columns;/* # of columns to process */intcolumns[MAX_COLS];/* the columns to process */charinput[MAX_INPUT];/* array for input line */charoutput[MAX_INPUT];/* array for output line *//*** Read the list of column numbers*/n_columns = read_column_numbers( columns, MAX_COLS );/*** Read, process and print the remaining lines of input.*/while( gets( input ) != NULL ){printf( "Original input : %s\n", input );rearrange( output, input, n_columns, columns );printf( "Rearranged line: %s\n", output );}return EXIT_SUCCESS;}/*** Read the list of column numbers, ignoring any beyond the specified** maximum.*/intread_column_numbers( int columns[], int max ){intnum = 0;intch;/*** Get the numbers, stopping at eof or when a number is < 0.*/while( num < max && scanf( "%d", &columns[num] ) == 1    && columns[num] >= 0 )num += 1;/*** Make sure we have an even number of inputs, as they are** supposed to be paired.*/if( num % 2 != 0 ){puts( "Last column number is not paired." );exit( EXIT_FAILURE );}/*** Discard the rest of the line that contained the final** number.*/while( (ch = getchar()) != EOF && ch != '\n' );return num;}/*** Process a line of input by concatenating the characters from** the indicated columns.  The output line is then NUL terminated.*/voidrearrange( char *output, char const *input,    int n_columns, int const columns[] ){intcol;/* subscript for columns array */intoutput_col;/* output column counter */intlen;/* length of input line */len = strlen( input );output_col = 0;/*** Process each pair of column numbers.*/for( col = 0; col < n_columns; col += 2 ){intnchars = columns[col + 1] - columns[col] + 1;/*** If the input line isn't this long or the output** array is full, we're done.*/if( columns[col] >= len ||    output_col == MAX_INPUT - 1 )break;/*** If there isn't room in the output array, only copy** what will fit.*/if( output_col + nchars > MAX_INPUT - 1 )nchars = MAX_INPUT - output_col - 1;/*** Copy the relevant data.*/strncpy( output + output_col, input + columns[col],    nchars );output_col += nchars;}output[output_col] = '\0';}