1.略
2.第二段代码更符合题目的要求(答案)
#include<stdio.h>
int main()
{
int i = 1 ;
char a[1000] ;
while ( gets( a ) != NULL )
{
printf ( "%d:%s\n", i, a ) ;
i++ ;
}
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
int line = 0 ; //行号
int col = 1 ; //
int ch ; //储存字符
while ( (ch = getchar()) != EOF) //读取字符并逐个处理
{
if ( col == 1) //如果位于一行的起始位置,打印行号
{
line += 1 ;
col = 0 ;
printf("%d: ", line ) ;
}
putchar( ch ) ; //打印字符
if ( ch == '\n') //对行尾进行检查
col = 1 ;
}
return EXIT_SUCCESS ;
}
3.
#include<stdio.h>
int main()
{
char ch ;
signed char checksum = -1 ;
while ( (ch = getchar()) != EOF) //读取字符并逐个处理
{
putchar( ch ) ;
checksum += ch ;
if ( ch == '\n')
{
printf ( "%d\n",checksum ) ;
checksum = -1 ;
}
}
return 0 ;
}
4.一篇博客里找的,写的很细(wrw112358写的
点击打开链接)
#include<stdio.h>
#include<string.h>
#define MAX 1000
int main(void)
{
int i ;
char ch ;
char len[MAX] ;
char temp[MAX] ;
while ( (ch = getchar()) != EOF) //读取字符并逐个处理 EOF:windows用Ctrl+z,LINUX用Ctrl+d
{
for ( i = 0; ch != '\n'; i++) //将输入的字符由getchar一个个的返回出来,并储存在temp中
{
temp[i] = ch ;
ch = getchar() ;
}
if ( strlen ( len ) < strlen ( temp ) ) //比较字符数组len和temp的字符长度
strcpy ( len, temp ) ; //将temp中的字符串复制到len中
}
printf ( "%s\n %d\n", len, strlen (len) ) ;
return 0 ;
}
5.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COLS 20 //所能处理的最大列号
#define MAX_INPUT 1000 //每个数入行的最大长度
int read_columns_number ( 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_columns_number ( columns, MAX_COLS ) ; //读取该列串列标号
while ( gets ( input ) != NULL ) //读取,处理和打印剩余的输入行
{
printf ( "Original input : %s\n", input ) ;
rearrange ( output, input, n_columns, columns ) ;
printf ( "Rearranged input : %s\n", output ) ;
}
return EXIT_SUCCESS ;
}
int read_columns_number ( int columns[], int max ) //读取列标号,如果超出规定范围则不予理会
{
int num = 0 ;
int ch ;
while ( num < max && scanf ( "%d", &columns[num] ) == 1 && columns[num] >= 0 ) //取得列标号,如果读取的数小于0则停止
num += 1 ;
if ( num % 2 != 0 ) //确认已读取的标号为偶数个
{
puts ( "Last columns number is 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[] )//处理输入行,将指定列的字符连接在一起,输出行以NUL结尾
{
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 ;
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 ;
// printf("%d\n",output);
}
output[output_col] = '\0' ;
}
6.不知有没有更好的写法,if用的感觉很蛋疼
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COLS 20 //所能处理的最大列号
#define MAX_INPUT 1000 //每个数入行的最大长度
int read_columns_number ( 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_columns_number ( columns, MAX_COLS ) ; //读取该列串列标号
while ( gets ( input ) != NULL ) //读取,处理和打印剩余的输入行
{
printf ( "Original input : %s\n", input ) ;
rearrange ( output, input, n_columns, columns ) ;
printf ( "Rearranged input : %s\n", output ) ;
}
return EXIT_SUCCESS ;
}
int read_columns_number ( int columns[], int max ) //读取列标号,如果超出规定范围则不予理会
{
int num = 0 ;
int ch ;
while ( num < max && scanf ( "%d", &columns[num] ) == 1 && columns[num] >= 0 ) //取得列标号,如果读取的数小于0则停止
num += 1 ;
while ( ( ch = getchar() ) != EOF && ch != '\n' ) //丢弃该行中包含最后一个数字的那部分内容
;
return num ;
}
void rearrange ( char *output, char const *input, int const n_columns, int const columns[] )//处理输入行,将指定列的字符连接在一起,输出行以NUL结尾
{
int col ; //columns数组的下标
int output_col ; //输出列计数器
int len ; //输出行的长度
len = strlen ( input ) ;
output_col = 0 ;
if ( n_columns % 2 == 0 ) //如果读取的标号为偶数个
{
for ( col = 0; col < n_columns; col += 2 ) //处理每对列标号
{
int nchars = columns[col + 1] - columns[col] - 1 ;
if ( columns[col] >= len ) //如果输入行没这么长,跳过这个范围
continue ;
if ( output_col == MAX_INPUT - 1 ) //如果输入行结束或输出行已满,就结束任务
break ;
if ( output_col + nchars > MAX_INPUT - 1 ) //如果输出行数据空间不够,只复制可以容纳的数据
nchars = MAX_INPUT - output_col - 1 ;
if ( columns[col] + nchars - 1 >= len ) //观察输入行中多少个字符在范围内,如果他小于nchars,就对nchars的值进行调整
nchars = len - columns[col] + 1 ;
strncpy ( output + output_col, input + columns[col], nchars ) ; //复制相关数据
output_col += nchars ;
}
output[output_col] = '\0' ;
}
else
{
if ( columns[n_columns - 1] >= len )
{
puts ( "Last columns number is paired." ) ;
exit ( EXIT_FAILURE ) ;
}
else
strcpy ( output, input + columns[n_columns - 1] ) ;
output[len - columns[n_columns - 1]] = '\n' ;
}
}