【问题标题】:Determining if *char < INT_MAX确定 *char < INT_MAX
【发布时间】:2015-10-25 13:10:30
【问题描述】:

我得到了这个代码:

char a[151];
scanf ("%150s", a);

a 中可能是一个数字,如果是,我需要确定是否为 a &lt; INT_MAX。我不知道该怎么做,因为在a char 的每个索引中可能是一个数字,这意味着如果我将一个值存储到某个 int 或其他任何内容中,这可能会导致溢出的 150 位数字。有什么建议吗?

【问题讨论】:

  • 可能使用int * 并为其分配内存,但可能内存分配过多。
  • char a[150]; -> char a[151];.
  • 为什么不是[150]?第一个字符的索引为 0 还是我错了?
  • 您要存储150 数字号码并使用%s,您需要为null character 留出空间。
  • 0 to 149 是150 地点。那么你就没有150 th 索引了。这就是为什么用151 元素声明的原因。

标签: c


【解决方案1】:

致电strtol() 并测试errno。

如果正确的值超出了可表示值的范围,LONG_MIN、LONG_MAX、...宏ERANGE的值存储在errno中。 C11dr §7.22.1.4 8

char a[151];
scanf ("%150s", a);
char *endptr;
errno = 0;
long num = strtol(a, &endptr, 10);
if (errno == ERANGE) Overflow();  // outside `long` range
if (num > INT_MAX) Overflow();    // greater than `INT_MAX`

【讨论】:

    【解决方案2】:

    一种解决方法:

    1. INT_MAX = 2147483647 --> contains 10 digits  
    2. len = strlen(a);  
    3. if (len > 10)   
       a. true --> then a > INT_MAX --> print answer and return  
       b. false, go to step 4  
    4. if (len < 10)  
       a. true --> then a < INT_MAX --> print answer and return  
       b. false, go to step 5  
    5. (len == 10) case  
    6. if (a[9]-'0' > 2) // 10th digit is > 2  
       a. true --> then a > INT_MAX --> print answer and return  
       b. false, go to step 7  
    7. int num = atoi(a);  
    9. Compare num and INT_MAX and print answer and return  
    

    [注意:这里不考虑负数]

    【讨论】:

    • 如果a == '2147483644' 怎么办?如果INT_MAX 有另一个值,它不应该是INT32_MAX。我的意思是它不能在 32 位电脑上运行
    • 注意:此方法将像“00000000000001”这样的输入声明为溢出。
    • 我同意这两个输入,它会使我的算法失败。 @chux,您建议的解决方案很好。
    • 这篇文章不正确,我应该删除它吗?或者有人请投反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多