主题:C语言命令行字符输出
qianying01
[专家分:0] 发布于 2010-12-19 19:22:00
各位大哥哥,大姐姐,小妹刚学C语言,遇到一难题,请不吝赐教
编写程序,程序读入一行字符,根据命令行中的参数不同,输出也不同。
为简单起见,命令行的参数中只含一个数字。
最后更新于:2010-12-25 19:48:00
回复列表 (共3个回复)
沙发
bruceteen [专家分:42660] 发布于 2010-12-19 21:13:00
#include <stdio.h>
#include <string.h>
#define max(a,b) (((a) > (b)) ? (a) : (b))
int main( int argc, char* argv[] )
{
int cmd = -10;
if( argc == 2 )
sscanf( argv[1], "%d", &cmd );
char line[260];
fgets( line, sizeof(line)/sizeof(line[0]), stdin );
int len = strlen( line );
if( len!=0 && line[len-1]!='\n')
{
// 你输入的这行真TMD的长呀,我一次没读下来,得分开读,代码不写了
}
else if( len!=0 )
{
--len;
line[len] = '\0';
}
if( cmd < 0 )
printf( "%s", line + max(len+cmd,0) );
else
printf( "%.*s", cmd, line );
return 0;
}
板凳
windy0will [专家分:2300] 发布于 2010-12-20 21:37:00
参数:
-fin 输入文件
-fout 输出文件
-line 要处理的行数
[code=c]
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define CAN_NOT_OPEN_FILE 0/* 不能打开文件 */
#define NO_THIS_PARAMETER 1/* 没有这个参数 */
#define MISSING_PARAMETER 2/* 缺少参数 */
#define ERROR_PARAMETER 3/* 错误参数 */
#define MAX_CHARS_IN_A_LINE 1024/* 一行最多能有的字符数 */
#define MULTIPLE_FIN 1/* 多个输入文件 */
#define MULTIPLE_FOUT 2/* 多个输出文件 */
#define MULTIPLE_WIDTH 4/* 制定了多个宽度参数 */
#define MULTIPLE_LINE 8/* 制定了多个行参数 */
#define IS_NOT_A_INTERGE 4/* 这不是一个整数 */
/* 出现了错误,显示信息,然后退出程序 */
#define ERROR(error_type,error_where) \
fprintf(stderr,info_err[error_type],error_where),exit(1)
static const char *info_err[ ] =
{ /* 错误信息 */
"\nerror : can't open file <%s>.", /* 不能打开文件 */
"\nerror : no this parameter <%s>.", /* 没有这个参数 */
"\nerror : missing parameter after parameter <%s>.", /* 缺少参数 */
"\nerror : error parameter <%s>", /* 错误参数 */
};
static const char *info_warn[ ] =
{ /* 警告信息 */
"\nwarn : input multiple files.", /* 多个输入文件 */
"\nwarn : output multiple files.", /* 多个输出文件 */
"\nwarn : multiple width-parameters.", /* 制定了多个宽度参数 */
"\nwarn : multiple line-parameters.", /* 制定了多个行参数 */
"\nwarn : <%s> is not a interge.", /* 这不是一个整数 */
};
int get_interge (const char *s)
{ /* 把字符串转换成整数,然后返回其值 */
const char *p = s;
int ch, ret = 0;
while (((ch = *p++ - '0')<=9) && (ch >= 0))
ret = (ret<<1) + (ret<<3) + ch;
/* 如果上面循环不是因为到达了空字符而结束的,那么这个字符不是一个整数 */
if (p[-1] != '\0') fprintf (stderr, info_warn[IS_NOT_A_INTERGE], s);
return ret;
}
[/code]
3 楼
windy0will [专家分:2300] 发布于 2010-12-20 21:38:00
[续]
[code=c]
int main (int argc, char * argv[ ])
{
struct {
signed int left_flag, width, line;/* 左对齐标志,宽度参数,行数参数 */
const char *fin, *fout;/* 输入输出的文件名 */
} format = {0, -1, -1, NULL, NULL};
int count = 0;/* */
int warn = 0;/* 保存警告信息 */
const char *p;
int *pi;
while (++count < argc)
{
pi = NULL;
p = (const char*)argv[count];
if (p[0] == '+'){
/* + 后的参数是 宽度参数 */
++p;
if (format.width != -1) warn |= MULTIPLE_WIDTH;
format.left_flag = 0;
pi = &format.width;
} else if (p[0] == '-'){
/* -fin 后面的参数表示的是从这个文件输入文件 */
if (strncmp(p, "-fin", 4) == 0) {
if (format.fin != NULL) warn |= MULTIPLE_FIN;
if (++count >= argc) ERROR (MISSING_PARAMETER, p);
format.fin = argv[count];
} else if (strncmp(p, "-fout", 5) == 0) {
/* -fout 后面的参数表示的是经要求处理后的字符将输出到这个文件 */
if (format.fout != NULL) warn |= MULTIPLE_FOUT;
if (++count >= argc) ERROR (MISSING_PARAMETER, p);
format.fout = argv[count];
} else if (strncmp(p, "-line", 5) == 0) {
/* -line 后面的参数表示的是有多少行要处理 */
if (++count >=argc) ERROR (MISSING_PARAMETER, p);
p = argv[count];
if (isdigit( *p ) == 0) ERROR (ERROR_PARAMETER, p);
if (format.line != -1) warn |= MULTIPLE_LINE;
pi = &format.line;
} else if (isdigit(p[1]) != 0) {
/* 如果 - 后面直接跟数字,那么这就是表示的 宽度参数 */
++p;
if (format.width != -1) warn |= MULTIPLE_WIDTH;
format.left_flag = 1;
pi = &format.width;
} else {
/* 错误的参数,退出程序 */
ERROR (NO_THIS_PARAMETER, p);
}
} else {
/* 错误的参数,退出程序 */
ERROR (NO_THIS_PARAMETER, p);
}
/* format.line 和 format.width 将从这里得到 */
if (pi != NULL) *pi = get_interge (p);
}
/* 输出警告信息 */
if (warn & MULTIPLE_FIN ) fprintf (stderr, info_warn[0]);
if (warn & MULTIPLE_FOUT ) fprintf (stderr, info_warn[1]);
if (warn & MULTIPLE_WIDTH) fprintf (stderr, info_warn[2]);
if (warn & MULTIPLE_LINE ) fprintf (stderr, info_warn[3]);
/* 默认的行数为1, 默认的宽度为10, 默认是从右边对齐的 */
if (format.line < 1) format.line = 1;
if (format.width < 1) format.width = 10;
/* 默认的输入流为stdin, 默认的输出流为stdout */
if ((format.fin != NULL) && (freopen(format.fin, "r", stdin) == NULL))
ERROR (CAN_NOT_OPEN_FILE, format.fin);
if ((format.fout!= NULL) && (freopen(format.fout,"w", stdout) == NULL))
ERROR (CAN_NOT_OPEN_FILE, format.fout);
{
int len, line = format.line;
char buf[MAX_CHARS_IN_A_LINE];
if (format.left_flag != 0)
/* 从左边 */
while (line-- > 0)
{
scanf ("%1024s", buf);
if (strlen (buf) > format.width)
buf[format.width] = '\0';
printf ("%s\n", buf);
}
else while (line-- > 0)
/* 从右边 */
{
scanf ("%1024s", buf);
len = strlen (buf);
len = len - format.width;
if (len < 0) len = 0;
printf ("%s\n", buf+len);
}
}
return 0;
}
[/code]
我来回复