回 帖 发 新 帖 刷新版面

主题:C语言命令行字符输出

各位大哥哥,大姐姐,小妹刚学C语言,遇到一难题,请不吝赐教

编写程序,程序读入一行字符,根据命令行中的参数不同,输出也不同。
为简单起见,命令行的参数中只含一个数字。

回复列表 (共3个回复)

沙发


#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;
}

板凳

参数:
-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 楼


[续]
[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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册