C语言指针调用函数问题,急求解释(本题是《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;//进行处理的列标号//这是哪里要处理的列数如上表示Max_COLS 20
//是表示的最大列数哪么列标号是什么意思
int columns[MAX_COLS];//需要处理的列数// 同上所示
char input[MAX_INPUT];
char output[MAX_INPUT];
n_columns = read_column_numbers(columns, MAX_COLS);
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;
}
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 += 1;
if(num % 2 !=0)
{
puts("Last column number is 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 col;
int output_col;
int len;
len = strlen(input);
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(output + output_col,input + columns[col],nchars);
output_col += nchars;
}
output[output_col] = '\0';
}
//求解释本题整个指针和调用函数的解释过程c小白多多见谅,谢谢!

我不清楚你的疑问到底指哪些。我就你写的这些代码解读:
int read_column_numbers(int columns[], int max)函数功能:
传参数组首地址,及数组最大长度。
用户输入max个整数,只保存其中的正整数(负数忽略),如果正整数的个数是偶数则返回个数。否则程序结束。
void rearrange(char *output,char const *input,int n_columns, int const columns[])函数功能:
传参 数组output首地址 , 数组input首地址 ,用户输入正整数个数,正整数数组
迭代数组,根据用户的输入的数字作为input起始下标,复制并拼接到数组output中(具体逻辑我不研究了)。
strncpy(output + output_col,input + columns[col],nchars)这里就是就是拼接复制,变量output_col记录的是output 已保存字符长度,output + output_col就是每次接在已有字符后面放复制的字符。input + columns[col]是用户输入的数字作为起始位置的偏移量取nchars个字符复制到output 中。
总结:
一、
首先数组名作为参数传递,无论形参定义是指针还是数组(int *columns 和 int columns[ ]效果是一样的),最终都是传地址。
二、
数组形参定义char const *,修饰符const表示常量不可修改,这里const修饰的是*input,表示数组指针指向的地址内容不能修改,但是数组指针本身值可以修改。也就是说函数中可以改变input指向的地址(比如input++),但是不能改变其指向的值(比如input[0]='A')。
温馨提示:答案为网友推荐,仅供参考
相似回答