程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了根据 ANSI/ISO C?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决根据 ANSI/ISO C??

开发过程中遇到根据 ANSI/ISO C?的问题如何解决?下面主要结合日常开发的经验,给出你关于根据 ANSI/ISO C?的解决方法建议,希望对你解决根据 ANSI/ISO C?有所启发或帮助;

我正在尝试在 sHell 脚本和 POSIX 实用程序中从头开始实现一个 esolang 解释器。原始解释器使用函数 scanf("%d",&i);我试图完全模仿 C 标准库的做法。

根据 C 标准,我认为 scanf("%d",&i); 或类似算法的正确算法应该是什么。

可以针对该函数假设多种输入,我想这些是示例(我认为 ? 上的 i 代表没有变化):

input            /returns/i     /next getchar() returns

"-1xxx"           1       -1    'x'
"WTF"             0       ?     'W'
"-++-"            0?      ??    first '+' or first '-'?
"-  3"            0?      ??    first ' ' or '-'?

我不只是确定要参哪些文件。

我目前在 AWK 中虑的实现:

function get_Integer( c,sign,digits){
   # assumes getchar() returns a digit of character codepoint; -1 for EOF
   # also assumes ungetc() can be done as many times as you want;
   # example
   #    ungetc(3); ungetc(4); c1=getchar(); c2=getchar(); c3=getchar();
   #    # c1==4,c2==3,c3 shall be actually next input
   for(;;){
      c=getchar();
      if(isblank(C)) conTinue;
      break;
   }
   sign=(c==43)-(c==45);
   if(sign!=0) c=getchar();
   if(sign==0&&!(48<=c&&c<=57)){
      if(Strict_modE) abort();
      if(!Strict_modE){
         # TBH I kNow against "   xyz"
         # Also "   +42" would not come here
         # BUT what about "   +Hello"
         # also what about "   +   33 "
         ungetc(c);
         if(sign!=0) ungetc(44-sign); # Todo: should I delete this line?
         return 0;
      }
   }
   if(sign==0) sign=1;
   # and then I kNow I shall repeat reading numbers until non-numbers come
   # then: ungetc(first non-number);
   # and finally: return final result;
}

澄清:我只想知道官方算法是什么。

解决方法

scanf("%d",&i); 首先消耗前导空格:isspace(),而不是 isblank()。如果下一个输入不是有效的 int 文本序列。至少 1 个字符被放回 stdin。如果需要在 "-+" 中放回更多字符,则它是 UB 或实现定义的。如果输入超出 int 范围,则 UB(做任何有意义的事情)。数字输入放回后输入。

大佬总结

以上是大佬教程为你收集整理的根据 ANSI/ISO C?全部内容,希望文章能够帮你解决根据 ANSI/ISO C?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。