【问题标题】:conversion string to int with cast in C在 C 中使用强制转换将字符串转换为 int
【发布时间】:2015-02-16 18:22:32
【问题描述】:

我有一个字符串(五个字符),我尝试进行 int 转换以将整个字符串转换为唯一值。它有效,但我想知道转换过程中会发生什么。例如

int main(){
char s[6];
int number;
Scanf("%s",s);
Number=(int)s;
Printf("%d",number);}

谢谢

【问题讨论】:

  • 请更新您的问题,使代码与您实际编译的代码相同。复制粘贴,不要重复输入。 (提示:Intint 在 C 中是不同的。)
  • 第一:char s[5]; 没有足够的空间容纳 5 个字符的字符串;您需要考虑 '\0' 终止符。
  • 可以按照您显示的方式进行转换(如果编译正确),但您会将字符串的地址转换为int,而不是字符串中文本数字的值。有多种方法可以做到这一点,例如sscanf()atoi()。更好的是scanf("%d", &number);
  • 我正在使用这种方法将用户密码从字符串转换为数字。这不是地址,因为在不同的机器上,相同的字符串返回相同的整数。
  • 您的Scanf()Printf() 函数是非标准的(而numberNumber 是不同的变量)。据推测,您的意思是 scanf()printf(),但 C 是一种区分大小写的语言,如果您以大写字母开头,没有人能确定您的意思。此外,行尾的} 对C 来说是可怕的、可恶的风格;完全不推荐。 (奇怪的是,当您不需要时,您可以在名称上使用大写字母,但当您确实需要时,却不能将 'i' 设为 'I')。

标签: c string casting type-conversion


【解决方案1】:

您似乎尝试使用的方法不起作用

s 是一个数组表达式。在大多数(但不是全部!)上下文中,数组表达式被隐式转换为指向其第一个元素的指针。

所以你有:

char s[5];
int number;
number = (int)s;

s,在隐式转换之后,产生一个指向数组第一个元素的指针,相当于&s[0]。强制转换将该指针值转换为 int 类型,产生可能或可能根本没有意义的结果(如果指针恰好比您系统上的 int 宽,它可能会丢失信息)。

你说它“有效”,但它根本没有达到你的意图。拥有相同字符串值的两个不同数组将具有不同的地址,并且在转换时可能会产生不同的int 值。

如果要跟踪每个数组对象的不同地址,请使用指针,而不是整数。如果出于某种原因,您需要与地址对应的不同整数值,请使用<stdint.h> 中定义的类型intptr_tuintptr_t,以保证您不会丢失信息(但这样做很少有意义) .

可以将强制转换(显式转换)视为一种告诉编译器您确切知道自己在做什么并覆盖类型检查(过于简单化)的方法。如果您确实知道自己在做什么,那很好。如果你不这样做,你很可能会朝自己的脚开枪。

您正在尝试获取与字符串对应的唯一值。你的实际目标是什么?为什么不能将字符串本身用作唯一值?

还有,这个:

scanf("%s",s);

不安全。它将从标准输入中读取任意长度的以空格分隔的字符序列。通过定义char s[5],您只为4 个字符的字符串留出了足够的空间(加上1 用于终止'\0')。如果用户键入的内容超过此值,多余的字符将破坏其他内存,导致无法预料的结果(技术术语是未定义的行为)。

【讨论】:

  • 目标是对字符串进行某种哈希处理。我知道有错误,但我想知道它是如何工作的。谢谢
  • @MarcoDeSimone:我希望您了解您尝试使用的方法不起作用
【解决方案2】:

如果我理解你的问题,忽略小错误

number =(int)s;

在您的情况下,s 是指向 5 个字符数组的指针,它存储数组的起始内存地址位置的地址。因此,在将其转换为整数时,它只是将作为整数的指针值复制到 number 变量。

因此,对于在控制台中输入的相同字符串,您将获得不同的数字值(因为为 s 分配的内存主要随每次执行而变化)。

【讨论】:

  • 这是否添加了我的答案中尚未包含的任何信息?
  • 发布我的答案后,我可以看到还有另一个答案。如果重复,我将删除..
【解决方案3】:
 #include<stdio.h>
 #include<stdlib.h>

 void main()
 {
   char arr[10] ="9821" ;// string in c 
   int a = 0 ;           // variable with data type int initialize by 0   

   a = atoi(arr);        // function of stdlib.h file convert arry to int and asign value to a 
   printf("%i",a) ;      // print int data form integer variable a

 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2013-03-25
    • 2012-05-26
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多