加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将a-z扩展为abc … xyz形式的方法

发布时间:2020-12-16 09:38:12 所属栏目:百科 来源:网络整理
导读:嗨:)我想要做的是编写一个简单的程序,从最短的条目扩展 例如 a-z or 0-9 or a-b-c or a-z0-9 写得最久 例如 abc…xyz or 0123456789 or abc or abcdefghijklmnouprstwxyz0123456789 1-st考试最短录入= 1-example示例结果应该给:) 到目前为止,我写了这样的东
嗨:)我想要做的是编写一个简单的程序,从最短的条目扩展

例如

a-z or 0-9 or a-b-c or a-z0-9

写得最久

例如

abc…xyz or 0123456789 or abc or abcdefghijklmnouprstwxyz0123456789

1-st考试最短录入= 1-example示例结果应该给:)

到目前为止,我写了这样的东西,它只适用于从a到z的字母:

expand(char s[])
{
   int i,n,c;
   n=c=0;
   int len = strlen(s);
   for(i = 1;s[i] > '0' && s[i]<= '9' || s[i] >= 'a' && s[i] <= 'z' || s[i]=='-';i++)
   {
      /*c = s[i-1];
      g = s[i];
      n = s[i+1];*/
      if( s[0] == '-')
          printf("%c",s[0]);
      else if(s[i] == '-')
      {
         if(s[i-1]<s[i+1])
         {
             while(s[i-1] <= s[i+1])
             {
                 printf("%c",s[i-1]);
                 s[i-1]++;
             }
         }
         else if(s[i-1] == s[i+1])
             printf("%c",s[i]);
         else if(s[i+1] != '-')
             printf("%c",s[i]);
         else if(s[i-1] != '-')
             printf("%c",s[i]);
    }
    else if(s[i] == s[i+1])
    {

      while(s[i] == s[i+1])
      {
           printf("%c",s[i]);
           s[i]++;
      }
    }
    else if( s[len] == '-')
         printf("%c",s[len]);
 }

}

但现在我被卡住了:(

任何想法我应该检查我的程序正常工作?

编辑1:@Andrew Kozak(1)abcd(2)01234

谢谢你提前:)

解决方法

这是一个满足 same test as my earlier C++ version.的C版本(大约38个有效行)

完整的测试程序包括您的测试用例,我的和一些酷刑测试可以在http://ideone.com/sXM7b#info_3915048现场直播

合理

我很确定我夸大了要求,但是

>这应该是如何以健壮的方式进行解析的一个很好的例子

>以明确的方式使用状态
>验证输入(!)

>此版本不假设a-c-b不会发生
>它也不会像’Hello World'(或(char *)0)这样的简单输入窒息甚至失败

>它显示了如何在不使用无关函数的情况下避免printf(“%c”,c)每个char.
>我提出了一些意见,以解释为什么会发生什么,但总的来说,你会发现代码更加清晰,无论如何,

>远离太多短命名变量
>使用不透明的索引器避免复杂的条件
>避免整个字符串长度业务:我们只需要2个字符的最大预测,如果它是空字符,* it ==’ – ‘或谓词(* it)将返回false. Shortcut evaluation阻止我们访问过去的输入字符

>一个警告:我没有对输出缓冲区溢出进行适当的检查(容量在2048个字符处硬编码).我会把它留给读者作为众所周知的练习

最后但并非最不重要的,我这样做的原因:

>它允许我比较C版本和C版本的原始性能,因为它们执行相同的功能.现在,我完全希望C版本能够胜过C(我们猜测:4倍?)但是,让我们再看看GNU编译器为我们带来了多少惊喜.更多以后更新结果我不远:github (code + results)

纯C实现

不用多说,实现,包括测试用例:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int alpha_range(char c) { return (c>='a') && (c<='z'); }
int digit_range(char c) { return (c>='0') && (c<='9'); }

char* expand(const char* s)
{
    char buf[2048];

    const char* in  = s;
          char* out = buf;

    // parser state
    int (*predicate)(char) = 0; // either: NULL (free state),alpha_range (in alphabetic range),digit_range (in digit range)
    char lower=0,upper=0;       // tracks lower and upper bound of character ranges in the range parsing states

    // init
    *out = 0;

    while (*in)
    {
        if (!predicate)
        {
            // free parsing state
            if (alpha_range(*in) && (in[1] == '-') && alpha_range(in[2]))
            {
                lower = upper = *in++;
                predicate = &alpha_range;
            }
            else if (digit_range(*in) && (in[1] == '-') && digit_range(in[2]))
            {
                lower = upper = *in++;
                predicate = &digit_range;
            } 
            else *out++ = *in;
        } else
        { 
            // in a range
            if (*in < lower) lower = *in;
            if (*in > upper) upper = *in;

            if (in[1] == '-' && predicate(in[2])) 
                in++; // more coming
            else
            {
                // end of range mode,dump expansion
                char c;
                for (c=lower; c<=upper; *out++ = c++);
                predicate = 0;
            }
        }
        in++;
    }

    *out = 0; // null-terminate buf
    return strdup(buf);
}

void dotest(const char* const input)
{
    char* ex = expand(input);
    printf("input : '%s'noutput: '%s'nn",input,ex);

    if (ex)
        free(ex);
}

int main (int argc,char *argv[])
{
    dotest("a-z or 0-9 or a-b-c or a-z0-9"); // from the original post
    dotest("This is some e-z test in 5-7 steps; this works: a-b-c. This works too: b-k-c-e. Likewise 8-4-6"); // from my C++ answer
    dotest("-x-s a-9 9- a-k-9 9-a-c-7-3"); // assorted torture tests

    return 0;
}

测试输出:

input : 'a-z or 0-9 or a-b-c or a-z0-9'
output: 'abcdefghijklmnopqrstuvwxyz or 0123456789 or abc or abcdefghijklmnopqrstuvwxyz0123456789'

input : 'This is some e-z test in 5-7 steps; this works: a-b-c. This works too: b-k-c-e. Likewise 8-4-6'
output: 'This is some efghijklmnopqrstuvwxyz test in 567 steps; this works: abc. This works too: bcdefghijk. Likewise 45678'

input : '-x-s a-9 9- a-k-9 9-a-c-7-3'
output: '-stuvwx a-9 9- abcdefghijk-9 9-abc-34567'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读