C和指针 第一章 字符串处理程序

#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类型。

posted @ 2016-08-10 22:51  xnuwu  阅读(327)  评论(0编辑  收藏  举报