标签:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_COL 20 #define MAX_INPUT 1000 int read_column_numbers(int columns[], int max); void rearrange(char *output, char *input, int n_columns, int const columns[]); int main(void) { int n_columns; int columns[MAX_COL]; char input[MAX_INPUT]; char output[MAX_INPUT]; n_columns = read_column_numbers(columns, MAX_COL); while (gets(input) != NULL) { printf("Origin Input: %s\n", input); rearrange(output, input, n_columns, columns); printf("rearrage Output: %s\n", output); } return EXIT_SUCCESS; } /* 读取第一行格式数字格式 */ int read_column_numbers(int columns[], int max) { int num = 0; int ch; while (num < max && scanf("%d", &columns[num]) == 1 && columns[num] >= 0){ num++; } if (num % 2 != 0){ puts("Last column number not paired."); exit(EXIT_FAILURE); } while ( (ch = getchar()) != EOF && ch != ‘\n‘){ ; } return num; } /* 对输入字符串进行格式化处理 */ void rearrange(char *output, char const *input, int n_columns, int const columns[]) { int output_col; /*输出数组计数器*/ int col; /*当前指向的输入字符数组的下标*/ int len; /*输入字符串的长度*/ len = strlen( input ); output_col = 0; for (col = 0; col < n_columns; col += 2) { int nchars = columns[col + 1] - columns[col]; /*字符数量*/ //当达到最大长度或者字符串末尾时,停止循环 if (columns[col] > len || output_col == MAX_INPUT - 1) { break; } //当长度超过最大长度,截取前部分字符串 if (output_col + nchars > MAX_COL - 1) { nchars = MAX_COL - output_col - 1; } //拷贝字符串 strncpy(output + output_col, input + columns[col], nchars); //偏移输出字符串 output_col += nchars; } //字符串结束 output[output_col] = ‘\0‘; }
注意事项:
1.scanf函数标量参数前加&符号.
2.函数标量参数是传值得方式进行传递,数组名参数具有传地址调用的语义。
3.没有字符串类型,字符串是以NUL字节结尾的字符。
4.符号NULL在stdio.h中定义,NUL并未定义,如需使用需自定义NUL为 ‘\0‘。
5.用int类型读取char类型,因为char是小int类型,EOF为int类型。
标签:
原文地址:http://www.cnblogs.com/yangxunwu1992/p/5759169.html