鱼C论坛

 找回密码
 立即注册
查看: 4822|回复: 4

c和指针第一个程序的问题

[复制链接]
发表于 2012-11-22 21:57:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sunlei20239 于 2012-11-22 22:04 编辑

在rearrange函数中的for循环col+=2,我觉得是col++就可以了
为什么是+2呢源程序如下:
/*
**首先读取一串列标号。这些列标号成对出现,表示输入行的列范围。这串列标号以一个负值结尾,作为结束标志。
**剩余的输入行将被程序读入并打印,然后输出行中被选中范围的字符串被提取出来并打印。
*/
#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;           //进行处理的列标号
        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("Oreginal input:%s\n",input);
                rearrange(output,input,n_columns,columns);
                printf("Rearrange line:%s\n",output);
        }
        return EXIT_SUCCESS;
}
int read_column_numbers(int columns[],int max)//读取列表号,如果超出规定范围则不予理会
{
        int num=0;
        int ch;
        
        printf("请输入要读取的起始列,和读取的末尾列:");
        //取得列表号,如果所读取的数小于0则停止
        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);
        }
        //丢弃该行中包含最后一个数组的那部分内容,过滤掉最后输入的-1
        while((ch=getchar())!=EOF&&ch!='\n')
                ;
        
        return num;
}
//处理输入行,将指定列的字符连接在一起,输出行以NUL结尾
void rearrange(char *output,char const *input,int n_columns,int const columns[])
{
        int col;        //columns数组的下标
        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;//nchars=9-4+1=6 若是第二次循环不就变成nchars= 20-12-1=9了
                //如果输入行结束或输出行数组已满,就结束任务
                if(columns[col]>=len||output_col==MAX_INPUT-1)
                        break;
                //如果输出行数组空间不够,只复制可以容纳的数据
                if(output_col+nchars>MAX_INPUT-1)
                        nchars=MAX_INPUT-output_col-1;//20-0-1=19
                //复制相关的数据
                strncpy(output+output_col,input+columns[col],nchars);
                //strncpy(output[0],input[4],6)
                //output_col=0+6=6,此意思是将数组下标标在最后
                output_col+=nchars;
        }
        output[output_col]='\0';
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-23 10:49:09 | 显示全部楼层
咋看不懂啊
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-23 13:47:11 | 显示全部楼层
int nchars=columns[col+1]-columns[col]+1;//nchars=9-4+1=6 若是第二次循环不就变成nchars= 20-12-1=9了第一次循环是columns[1]-columns[0] 而第二次循环就是columns[3]-columns[2] ,没有columns[2]-columns[1】 怀疑书上有误 但是运行是确实有columns[2]-columns[1]  不知都怎么回事求解
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-23 15:53:24 | 显示全部楼层
那 那 那 小兔子太可爱了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-23 18:11:25 | 显示全部楼层
么有看懂啊!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表