似乎找到一个不错的地方来记录学习过程~
每天记录自己或者是抄的或者是写的一些代码,供以后参考复习使用吧。
题目描述:首先读取一串列标号。这些列标号成对出现,表示输入行的列范围。这串列标号以一个负值结尾,作为结束标志。剩余的输入行被程序读入并打印,然后输入行中被选中范围的字符串被提取出来并打印。注意,每行第1列的列标号为0。例如,如果输入如下:
4 9 12 20 -1
abcdefghijklmnopqrstuvwxyz
Hello there, how are you?
I am fine, thanks.
See you!
Bye
则程序输出如下:
Original input:abcdefghijklmnopqrstuvwxyz
Rearranged line:efighijmnopqrstu
Original input:Hello there, how are you?
Rearranged line:o ther how are
Original input:I am fine, thanks.
Rearranged line: fine,hanks.
Original input:See you!
Rearranged line:you!
Original input:Bye
Rearranged line:
——《C和指针》1.1
代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define MAX_COLS 20 5 #define MAX_INPUT 1000 6 7 int read_column_numbers(int columns[], int max); 8 void rearrange(char *output, char const *input, int n_columns, int const columns[]); 9 10 int main() 11 { 12 int n_columns;//进行处理的列编号 13 int columns[MAX_COLS];//需要处理的列数 14 char input[MAX_INPUT];//容纳输入行的数组 15 char output[MAX_INPUT];//容纳输出行的数组 16 17 //读取该串列标号 18 n_columns = read_column_numbers(columns, MAX_COLS); 19 20 //读取、处理和打印剩余的输入行 21 while (gets(input) != NULL){ 22 printf("Original input:%s\n ", input); 23 rearrange(output, input, n_columns, columns); 24 printf("Rearrange line:%s\n", output); 25 } 26 27 return EXIT_SUCCESS; 28 } 29 30 //读取列标号函数,如果超出规定范围则不予理会 31 int read_column_numbers(int columns[], int max) 32 { 33 int num = 0; 34 int ch; 35 //取得列标号,如果所读取的数小于0 停止 36 while (num < max && scanf("%d", &columns[num]) == 1 && columns[num] >= 0) 37 num += 1; 38 //确认读取的标号是偶数个 39 if (num % 2 != 0){ 40 puts("Last column number is not paired."); 41 exit(EXIT_FAILURE); 42 } 43 //丢弃改行中包含最后一个数字的那部分内容 44 while ((ch = getchar()) != EOF&&ch != ‘\n‘) 45 ; 46 return num; 47 } 48 49 //处理输入行函数,将指定列的字符连在一起,输出以NULL结尾 50 void rearrange(char *output, char const *input, int n_columns, int const columns[]) 51 { 52 int col;//columns数组的下标 53 int output_col;//输出列计数器 54 int len;//输入行的长度 55 56 len = strlen(input); 57 output_col = 0; 58 59 //处理每对列标号 60 for (col = 0; col < n_columns; col += 2){ 61 int nchars = columns[col + 1] - columns[col] + 1; 62 63 //如果输入行结束或输出行数组已满,就结束任务 64 65 if (columns[col] >= len || 66 output_col == MAX_INPUT - 1) 67 break; 68 69 //如果输出行数据空间不够,只复制可以容纳的数据 70 if (output_col + nchars>MAX_INPUT - 1) 71 nchars = MAX_INPUT - output_col - 1; 72 73 //复制相关数据 74 strncpy(output + output_col, input + columns[col], nchars); 75 output_col += nchars; 76 } 77 output[output_col] = ‘\0‘; 78 }
时间: 2024-11-08 06:47:23