是否可以将字符串转换为int以获取转换后的值?

时间:2017-04-17 06:33:36

标签: c string casting integer

当从文件中读取或输入输入时,将字符串(字符数组)强制转换为int会很好。

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

    #define SIZE 500

    int main(void)
    {
    FILE* pfile;
    pfile = fopen("/tmp/code","r");                                            

    char *stringBuffer = (char *)malloc(SIZE * sizeof(char));                 

    char ch;
    int i = 0;
    ch = getc(pfile);                                                         
    while(ch != EOF)                                                          
    {
        stringBuffer[i] = ch;
        ch = getc(pfile);
        i++;
    }

    fclose(pfile);

    int stringSize = (int)(sizeof(stringBuffer)/sizeof(char));
    stringBuffer = (char *)realloc(stringBuffer,(stringSize * sizeof(char)));

    printf("the string works: %s \n",stringBuffer);
    int multi;
    int sum;

   for(int x =0; x < stringSize; x++)
   {
      int intger = ((int)stringBuffer[((stringSize - 1) - x)] - 48);

      if( x != 0 )
      {
        multi = (int)pow(10,x);
        sum += ( multi * intger );
      }
      else
        sum += intger;
    }
    printf("the int works: %i \n",sum);
    free(stringBuffer);
    return(0);
    }

我意识到我可以     1.将char作为int&amp;从ASCII转换为实数     2.multiplier each(now int)by是小数位(由数组位置确定)     3.加在一起     例如(警告这段代码有点难看,我还没有看过两次,到目前为止只是一个测试)

<form name="updateform" method="post" action="updateVehicleModel.php">
  <div class="form-group">
    <LABEL>Enter Vehicle Model</LABEL>
    <input  type="hidden" name="modelid" value="<?php if(isset($row['id_vehiclemodel'])) { echo $row['id_vehiclemodel']; } ?>" />
    <input type="text" name="model" value="<?php if(isset($row['vehicle_model'])) { echo $row['vehicle_model']; } ?>" required class="form-control col-md-3 col-sm-3" />
  </div>

  <div class="form-group">
    <label>Choose Vehicle Type</label>
    <input  type="hidden" name="modelid" value="<?php if(isset($row['id_vehiclemodel'])) { echo $row['id_vehiclemodel']; } ?>" />
    <select class="form-control" name="fkvehicleType" value="<?php if(isset($row['id_vehicleType'])){echo $row['vehicle_Type'];}?>">
      <option value="">Select Vehicle Type</option>
      <?php
        $res=mysqli_query($link,"Select * from vehicletype where status_vehicleType='1'");

        while ($row=mysqli_fetch_array($res)) {
          ?>
        <option value=<?php echo $row['id_vehicleType'];?>><?php echo $row['vehicle_Type'];?></option>
          <?php
        }

      ?>
    </select>
  </div>

  <div class="form-group">
    <label>Choose Vehicle Brand</label>

    <select class="form-control" name="fkvehicleBrand" value="<?php if(isset($row['id_vehicleBrand'])){echo $row['vehicle_Brand'];}?>">
        <option value="">Select Vehicle Brand</option>
    <?php
        $res=mysqli_query($link,"Select * from vehiclebrand where status_vehicleBrand='1'");

    while ($row=mysqli_fetch_array($res)) {
      ?>
    <option value=<?php echo $row['id_vehicleBrand'];?>><?php echo $row['vehicle_Brand'];?></option>
      <?php
    }

    ?>
    </select>
  </div>
  <div class="form-group">
    <label>Choose Status</label>
    <select name="statustype" value="<?php if(isset($row['vehicle_model'])) { echo $row['vehicle_model']; } ?>" required class="form-control">
      <option value="1">Enabled</option>
      <option value="0">Disabled</option>
    </select>
  </div>
  <div class="form-group">
    <input type="submit" name="submit" value="Update" class="btn btn-info btn-block" />
  </div>

  <span class="text-success"><?php if (isset($success)) { echo $success; } ?></span>
  <span class="text-danger"><?php if (isset($error)) { echo $error; } ?></span>

</form>

但仍然像int一样转换为字符串会很好(我假设c ++有这个吗?)。

2 个答案:

答案 0 :(得分:0)

它无法按照您的预期运作。

==&gt; 如果是

之类的声明
  int intger = (int)stringBuffer;

施放&#34;字符串&#34; (或者,指向char数组的第一个元素的指针)到int是高度实现定义的行为,如果实现不正确支持,将导致未定义的行为。

==&gt; OTOH,如

之类的声明
 int intger = (int)*stringBuffer; 

尝试取消引用stringBuffer指向的第一个内存位置,然后将该值转换为int(无论如何都会隐式完成)。这不会将整个字符串内容转换为整数类型。这就是为什么你会看到像

这样的东西
  

如果超过1位小数,则整数不起作用:%[......]

解决方案:从您的问题陈述中,您似乎可以使用strtol()或变体。您需要使用fgets()或类似内容读取整行,然后(在解析后,如果需要)将其传递给strtol()以转换为long int

之后,关于您的代码的说明:

  • while(ch != EOF)循环体中,您使用i进行了不受控制的迭代,这可能会导致超出内存访问。
  • int stringSize = (int)(sizeof(stringBuffer)/sizeof(char));不会为您提供字符串大小,您需要空终止字符串并使用strlen()来获取字符串的长度。

那说,一些一般性评论:

答案 1 :(得分:0)

对于您的示例,您可以使用fscanf函数简化整个代码。

FILE* pfile;
pfile = fopen("/tmp/code","r");

int intger;
fscanf(pfile, "%i", &intger);

fclose(pfile);

如果你需要字符串和整数,你可以用同样的方式使用sscanf函数,或strtol函数。