【问题标题】:Is it possible to cast a string as int to get the value converted?是否可以将字符串转换为 int 以转换值?
【发布时间】:2017-09-12 18:28:25
【问题描述】:

在读取文件或接受输入时,将字符串(字符数组)转换为 int 会很好。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 500

int main(void)
{
 FILE* pfile;
 pfile = fopen("/tmp/code","r");                              //open file
 char *stringBuffer = (char *)malloc(SIZE * sizeof(char));   //dynamic string

  char ch;
  int i = 0;
  ch = getc(pfile);                                          //read file
  while(ch != EOF)                                           //until end
  {                                                          //pass into string 
        counter++;
        stringBuffer[i] = ch;
        ch = getc(pfile);
        i++;
    }

    fclose(pfile);                                              //resize string

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

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

    int intger = (int)*stringBuffer;    //this is what i want to work!!!!

    //but more like
    //int intger = (int)stringBuffer; 

    printf("the intger doesn't work if more than 1 decimal place: %i \n",(intger - 48));

    free(stringBuffer);
    return(0);
    }
~                                                                                                                                          
~      

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

 #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);
    }

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

【问题讨论】:

  • atoi 是一个标准库函数,它可能做你想做的事?
  • @AjayBrahmakshatriya 除了,你不能,混叠违规,对齐错误等等。
  • @AjayBrahmakshatriya 如果你想将前 4 个字符(或者你的 sizeof(int) 是什么)转换为单个整数,你可以这样做 *(int*)stringBuffer 这违反严格的别名。您不能安全地将char * 视为int *。在对 int 等具有实际对齐限制的系统上执行此操作,您的程序可能会因 SIGBUS 或类似内容而失败。
  • @AndrewHenle 很​​好,然后必须通过 char[sizeof(int)] 和 int 的联合来完成。这应该没问题,因为整个 Union 将与 int 对齐,这将是正确的类型双关语。

标签: c string casting integer


【解决方案1】:

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

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

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

fclose(pfile);

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

【讨论】:

    【解决方案2】:

    它不会按您期望的方式工作。

    ==>如果是这样的陈述

      int intger = (int)stringBuffer;
    

    将“字符串”(或指向char 数组的第一个元素的指针)转换为int 是高度实现定义的行为,如果实现不正确支持,将导致未定义的行为。

    ==> OTOH,类似的声明

     int intger = (int)*stringBuffer; 
    

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

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

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

    之后,关于您的代码的注释:

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

    也就是说,一些通用的cmets:

    【讨论】:

    • 太棒了,谢谢你的DV,我想我也可以要求评论来改进帖子吗?
    • 我很惊讶地看到这个答案有两个反对票?
    • @ThomasPadron-McCarthy 我猜很多人丢失了他们的钥匙。 :)
    • 哈哈希望我在一小时前读到这篇文章我一直在试图弄清楚我的 EOF 发生了什么,谢谢!我不明白我是如何“与 i 进行不受控制的迭代”的,请您澄清一下,非常感谢。是的 strtol(),或者上面提到的 fscanf() 应该可以很好地工作,非常复杂,但我必须学习 stdlib 一些方法!
    • @jhonythompson 关于不受控制的迭代,请查看索引。您已经静态分配了500 字节的内存,但您对i 的值没有限制。对于某些输入,很可能在索引499 之前没有EOF,然后i 的值将增加到500,并且该索引会导致越界访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    相关资源
    最近更新 更多