C和指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C和指针相关的知识,希望对你有一定的参考价值。

似乎找到一个不错的地方来记录学习过程~

每天记录自己或者是抄的或者是写的一些代码,供以后参考复习使用吧。

题目描述:首先读取一串列标号。这些列标号成对出现,表示输入行的列范围。这串列标号以一个负值结尾,作为结束标志。剩余的输入行被程序读入并打印,然后输入行中被选中范围的字符串被提取出来并打印。注意,每行第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 }

 

以上是关于C和指针的主要内容,如果未能解决你的问题,请参考以下文章

为啥在访问二级指针时出现分段错误错误? C语言

使用 std::thread 函数 C++11 将指针作为参数传递

片段中的 EditText 上的空指针异常 [重复]

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

空指针异常 - 片段活动

片段中的 Listview 适配器给出空指针异常