C语言把字符串转换为数字

C当中有一些函数专门用于把字符串形式转换成数值形式

printf()函数和sprintf()函数 -->通过转换说明吧数字从数字形式转换为字符串形式;

scanf()函数把输入字符串转换为数值形式;

应用场景:

编写程序需要使用数值命令形参,但是命令形参被读取为字符串。要使用数值必须先把字符串转换为数字。

atoi()函数

int atoi(char *str);

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(void)
 5 {
 6     int i,times;
 7     
 8     if(argc < 2 || times = atoi(argv[1])<1)
 9         printf("Usage:%s positive-number\n",argv[0]);
10     else
11         for(i=0;i<times;i++)
12             puts("Hello,good looking!");
13     
14     return 0;
15 }

程序运行示例:

$ hello 3

Hello, good looking!

Hello, good looking!

Hello, good looking!

作用就是根据参数,选择打印几次Hello, good looking!

如果参数开头是非数字字符,则atoi函数返回值是0;因为这种行为是未定义的。因此需要有错误检测功能的strtol()函数会更安全。

 

stdlib.h头文件:不仅包含atoi()函数,还包含了atof()函数、atol()函数;

atof()函数把字符串转换成double类型的值;

atol()函数把字符串转换成long类型的值;

++++++++++++++++++++++++++++++++++++++++++++++++++++++

strtol函数原型:long strtol(const char * restrict nptr,char ** restrict endptr, int base);

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define LIM 30
 4 char * s_gets(char * st, int n);
 5 
 6 
 7 int main(void)
 8 {
 9     char number[LIM];
10     char * end;
11     long value;
12 
13     puts("Enter a number (empty line to quit);");
14     while(s_gets(number,LIM)&& number[0] !='\0')
15     {
16         value =strtol(number,&end,10);
17         printf("base 10 input,base 10 output:%ld,stopped at %s (%d)\n",value,end, *end);
18         value = strtol(number, &end, 16);
19         printf("base 16 input,base 10 output:%ld,stopped at %s (%d)\n",value,end, *end);
20         puts("Next number:");
21     }
22     puts("Bye!\n");
23     return 0;
24 }
25 
26 char * s_gets(char * st, int n)
27 {
28     char * ret_val;
29     int i=0;
30 
31     ret_val = fgets(st, n, stdin); //读取成功,返回一个指针,指向输入字符串的首字符;
32     if(ret_val)
33     {
34         while(st[i]!='\n' && st[i]!='\0')
35             i++;
36         if(st[i] =='\n') //fgets会把换行符也吃进来了,fgets会在末尾自动加上\0;
37             st[i]='\0';
38         else   //其实是'\0'
39             while(getchar() != '\n')  //会把缓冲区后续的字符都清空
40                 continue;
41     }
42     return ret_val;
43 }

程序运行:

Enter a number (empty line to quit);
10
base 10 input,base 10 output:10,stopped at (0)
base 16 input,base 10 output:16,stopped at (0)
Next number:
10atom
base 10 input,base 10 output:10,stopped at atom (97)
base 16 input,base 10 output:266,stopped at tom (116)
Next number:

转载于:https://www.cnblogs.com/grooovvve/p/9938986.html

<think>好的,我现在需要回答用户关于C语言中将字符串转换数字的问题。首先,我要回顾用户提供的引用内容,看看有哪些现有的方法已经被提到。引用中提到了几种方法,包括使用_itoa、自定义函数Myatoi、strtol函数以及另一种自定义方法。不过用户的问题是关于字符串数字,而_itoa实际上是数字字符串,所以可能需要排除这个。接下来,我需要整理C语言中常用的字符串数字的方法,并参考用户提供的引用中的例子。首先,C标准库中有几个内置函数,比如atoi、atol、atof,分别用于将字符串转换为整数、长整数和浮点数。这些函数比较简单,但缺点是没有错误检测功能,如果字符串格式不正确,可能会导致未定义行为。然后,还有更安全的函数如strtol、strtoul、strtod等,它们可以处理不同进制,并且提供错误检测,通过检查endptr来判断是否转换成功。用户提供的引用[3]中提到了strtol的用法,特别是处理16进制字符串的情况,这应该是一个重点。 另外,用户提供的引用[2]和[4]展示了两种自定义的字符串转整数函数。引用[2]中的Myatoi函数遍历字符串,提取所有数字字符并组合成整数,例如将“12ab12a”转换为1212。而引用[4]中的方法则是从字符串末尾开始,逐位计算数值,这可能与标准atoi的实现不同,因为标准方法是从左到右处理,并且会考虑符号。需要指出这两种自定义方法的区别和潜在问题,比如无法处理负数或溢出情况。接下来,我需要组织这些信息,分点说明不同的方法,包括标准库函数和自定义实现。同时,要指出每种方法的优缺点,比如安全性、错误处理能力、支持的进制等。例如,strtol函数支持指定基数,并且可以检测无效输入,而atoi则没有这些功能。自定义函数可能更适合特定需求,但通常缺乏全面的错误处理。 还要注意用户可能的深层需求,比如处理不同进制(如16进制)的转换,这在嵌入式系统中常见,如引用[3]中的例子。需要强调strtol在这方面的重要性。此外,用户可能关心如何处理转换失败的情况,因此要说明如何使用endptr参数来验证转换是否成功。最后,生成相关问题,可能涉及性能比较、错误处理的最佳实践,或者如何扩展自定义函数以支持更多功能,比如浮点数或带符号的数字。确保问题覆盖用户可能感兴趣的后续话题。</think>在C语言中,字符串数字主要通过标准库函数和自定义函数实现,以下是具体方法及注意事项: --- ### 一、标准库函数 1. **`atoi`/`atol`/`atof`** - **功能**:将字符串转换为整数、长整数、浮点数。 - **语法**: ```c int num = atoi("123"); // 字符串转int double val = atof("3.14"); // 字符串转double ``` - **缺点**:无错误检测,非法输入返回0或未定义值[^2][^4]。 2. **`strtol`/`strtoul`/`strtod`** - **功能**:支持进制转换和错误检测。 - **示例(16进制转换)**: ```c char *endptr; long num = strtol("1A", &endptr, 16); // 按16进制解析 if (*endptr != '\0') printf("转换失败"); ``` - **优势**:可检测非法字符,支持2~36进制[^3]。 --- ### 二、自定义函数实现 1. **正向逐字符解析** - **逻辑**:遍历字符串,将每个数字字符叠加为整数。 - **代码示例**: ```c int Myatoi(const char *str) { int tmp = 0; while (*str) { if (isdigit(*str)) tmp = tmp * 10 + (*str - '0'); str++; } return tmp; } ``` - **限制**:无法处理负数,忽略非数字字符(如"12ab"→12)[^2]。 2. **反向逐位计算** - **逻辑**:从字符串末尾开始,按位数累加。 - **代码示例**: ```c int Myatoi(const char *pString) { int Value = 0, Times = 1; for (int i = strlen(pString)-1; i >= 0; i--) { Value += (pString[i] - '0') * Times; Times *= 10; } return Value; } ``` - **限制**:仅支持纯数字字符串(如"123"→123)[^4]。 --- ### 三、选择建议 - **简单场景**:用`atoi`快速转换(需确保输入合法)。 - **安全场景**:用`strtol`检测错误并支持多进制[^3]。 - **特殊需求**:自定义函数过滤非数字字符[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值