【问题标题】:convert a string in to int in c [duplicate]在c中将字符串转换为int [重复]
【发布时间】:2015-07-08 07:18:59
【问题描述】:

我有一个包含 12 个字符的字符串,并且想将其转换为 int 或者我们可以说 digit ,但无法做到。我编写了一个将字符串转换为 11 位数字的代码,但之后它开始提供垃圾值。 我的代码是这样的

#include<stdio.h>
double myAtoi(char *str);
void main()
{
    double n;
    double m;
    char* a="12345678912";
    char* b="34";
    n=myAtoi(a);
    //m=atoi(b);
    printf("\nconversion is : %d",(n));
}

double myAtoi(char *str)
{   
    printf("\nstr : %s",str);
    long res = 0; // Initialize result
    long i ;
    // Iterate through all characters of input string and update result
    for (i = 0; str[i] != '\0'; ++i)
    {
        res = res*10 + str[i] - '0';
        printf("\n res : %d",res);
        //x=res;
    }
    return res;
}

【问题讨论】:

  • C++ 的答案将完全不同。你确定你想要那些吗?如果不是,那么 c++ 与这个问题有什么关系?
  • 请缩进您的代码。
  • 我怀疑您的意思是return res;,因为该代码中没有任何名为“x”的东西。而且你的printf 格式字符串是错误的,所以即使你修复它,你也可能会打印垃圾。
  • @Aniket Amrutkar 你的问题解决了吗?
  • 是的.. @ameyCU 给了我正确的答案..

标签: c++ c


【解决方案1】:

错误:

  • 什么是x?它在哪里声明?你为什么注释掉复制res到x的代码?为什么将它复制到循环内部而不是函数末尾?如果你坚持使用双精度,你甚至不需要x,只需要return (double)res;,原因不明。
  • 12345678912 是 123 亿。通常long 只能容纳 2^32 / 2 = 21.4 亿作为最大数。考虑使用long long
  • 您使用 %d 转换说明符打印 long 和 double,这在两种情况下都是错误的。
  • 您可能甚至不想在此程序中使用 double,它没有任何意义。

其他:

  • 由于这是一个托管系统,因此 main 必须声明为 int main (void)Reference
  • 始终将指向字符串文字的指针声明为const char*。因为您永远不会写入字符串文字,而只能从中读取。
  • 函数的参数也应该声明为const char*,以保证 const 的正确性。

【讨论】:

    【解决方案2】:

    问题是long 不能容纳与“12345678912”一样大的数字,而是使用 unsigned long long.

    它的说明符是"%llu"

    并且在你的代码中x 也没有被声明,而是使用return res;

    当您使用unsigned long long 时,您需要将函数double myatoi() 的定义更改为unsigned long long myatoi() -

    你的程序可以重写如下 -

    #include<stdio.h>
    unsigned long long myAtoi(char *str);
    int main()
    {
    
       unsigned long long  n; // Note here n also changed from double to unsigned long long
       double m;
       char* a="12345678912";
       char* b="34";
       n=myAtoi(a);
       //m=atoi(b);
       printf("\nconversion is : %llu",(n));
    }
    
       unsigned long long myAtoi(char *str)
    {   
    
       printf("\nstr : %s",str);
       unsigned long long res = 0; // Initialize result
       long i ;
       // Iterate through all characters of input string and update result
       for (i = 0; str[i] != '\0'; i++) 
      {
           res = res*10 + str[i] - '0';
           printf("\n res : %llu",res);
           //x=res; 
      }
         return res;
    }
    

    【讨论】:

    • 非常感谢。它工作正常...
    • @AniketAmrutkar 一般规则如果它有助于接受答案,不用担心你的程序:)。
    【解决方案3】:

    我认为问题在于您不能将“12345678912”保留为长变量。 请参考 http://www.tutorialspoint.com/cprogramming/c_data_types.htm

    长变量可以容纳的最大值是 -2,147,483,648 到 2,147,483,647

    并且你从你的方法返回错误的值。返回 res 而不是 x。在该代码中不需要 x。

    【讨论】:

    • C 指定最小值long 的范围是 -2,147,483,647 到 2,147,483,647。 C 没有指定其最大范围。 -2,147,483,6482,147,483,647 是常用范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2020-08-27
    • 1970-01-01
    • 2015-09-21
    • 2014-07-05
    • 2015-06-18
    • 2017-05-07
    相关资源
    最近更新 更多