在 C 中使用 cast 将字符串转换为 int
conversion string to int with cast in C
我有一个字符串(五个字符),我尝试进行 int 转换以将整个字符串转换为唯一值。它有效,但我想知道转换过程中发生了什么。例如
int main(){
char s[6];
int number;
Scanf("%s",s);
Number=(int)s;
Printf("%d",number);}
谢谢
您尝试使用的方法无效。
s
是数组表达式。在大多数(但不是全部!)上下文中,数组表达式被隐式转换为指向其第一个元素的指针。
所以你有:
char s[5];
int number;
number = (int)s;
s
,在隐式转换后,产生一个指向数组第一个元素的指针,相当于&s[0]
。转换将该指针值转换为类型 int
,产生的结果可能根本没有意义(如果指针碰巧比系统上的 int
宽,它可能会丢失信息)。
你这么说 "works",但它根本不符合你的意图。两个包含相同字符串值的不同数组将具有不同的地址,并且 可能 在转换时产生不同的 int
值。
如果要跟踪每个数组对象的不同地址,请使用指针,而不是整数。如果出于某种原因,您需要与地址相对应的不同整数值,请使用 <stdint.h>
中定义的 intptr_t
或 uintptr_t
类型以保证您不会丢失信息(但它很少这样做很有意义)。
转换(显式转换)可以被认为是一种告诉编译器您确切知道自己在做什么并覆盖类型检查的方式(这是一种过度简化)。如果您 do 知道自己在做什么,那很好。如果不这样做,您可能会搬起石头砸自己的脚。
您正在尝试获取与字符串对应的唯一值。你的实际目标是什么?为什么不能将字符串本身用作唯一值?
另外,这个:
scanf("%s",s);
不安全。它将从标准输入中读取任意长度的以空格分隔的字符序列。通过定义 char s[5]
,您只允许足够的空间容纳 4 个字符的字符串(加上 1 用于终止 '[=22=]'
)。如果用户输入的字符超过这个数量,多余的字符会破坏其他内存,导致不可预知的结果(技术术语是 未定义的行为)。
如果我理解你的问题忽略小错误
number =(int)s;
在你的例子中,s 是一个指向 5 个字符数组的指针,它存储了数组起始内存地址位置的地址。因此,在将其转换为整数时,它只是将整数指针值复制到数字变量中。
因此,对于在控制台中输入的相同字符串,您将获得不同的数字值(因为为 s 分配的内存主要随每次执行而变化)。
#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
}
我有一个字符串(五个字符),我尝试进行 int 转换以将整个字符串转换为唯一值。它有效,但我想知道转换过程中发生了什么。例如
int main(){
char s[6];
int number;
Scanf("%s",s);
Number=(int)s;
Printf("%d",number);}
谢谢
您尝试使用的方法无效。
s
是数组表达式。在大多数(但不是全部!)上下文中,数组表达式被隐式转换为指向其第一个元素的指针。
所以你有:
char s[5];
int number;
number = (int)s;
s
,在隐式转换后,产生一个指向数组第一个元素的指针,相当于&s[0]
。转换将该指针值转换为类型 int
,产生的结果可能根本没有意义(如果指针碰巧比系统上的 int
宽,它可能会丢失信息)。
你这么说 "works",但它根本不符合你的意图。两个包含相同字符串值的不同数组将具有不同的地址,并且 可能 在转换时产生不同的 int
值。
如果要跟踪每个数组对象的不同地址,请使用指针,而不是整数。如果出于某种原因,您需要与地址相对应的不同整数值,请使用 <stdint.h>
中定义的 intptr_t
或 uintptr_t
类型以保证您不会丢失信息(但它很少这样做很有意义)。
转换(显式转换)可以被认为是一种告诉编译器您确切知道自己在做什么并覆盖类型检查的方式(这是一种过度简化)。如果您 do 知道自己在做什么,那很好。如果不这样做,您可能会搬起石头砸自己的脚。
您正在尝试获取与字符串对应的唯一值。你的实际目标是什么?为什么不能将字符串本身用作唯一值?
另外,这个:
scanf("%s",s);
不安全。它将从标准输入中读取任意长度的以空格分隔的字符序列。通过定义 char s[5]
,您只允许足够的空间容纳 4 个字符的字符串(加上 1 用于终止 '[=22=]'
)。如果用户输入的字符超过这个数量,多余的字符会破坏其他内存,导致不可预知的结果(技术术语是 未定义的行为)。
如果我理解你的问题忽略小错误
number =(int)s;
在你的例子中,s 是一个指向 5 个字符数组的指针,它存储了数组起始内存地址位置的地址。因此,在将其转换为整数时,它只是将整数指针值复制到数字变量中。
因此,对于在控制台中输入的相同字符串,您将获得不同的数字值(因为为 s 分配的内存主要随每次执行而变化)。
#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
}