将a-z扩展为abc … xyz形式的方法
嗨:)我想要做的是编写一个简单的程序,从最短的条目扩展
例如
写得最久 例如
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不会发生 >它显示了如何在不使用无关函数的情况下避免printf(“%c”,c)每个char. >远离太多短命名变量 >一个警告:我没有对输出缓冲区溢出进行适当的检查(容量在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' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |