我的代码行如下,
char conv[20]="score: 34";
我想在'conv'字符串中提取数字(34)并将其转换为整数。我用'atoi'功能。但结果是0。
printf("score: %d\n",atoi(conv)); //this prints 'score: 0'
有人可以帮我将该字符串中的数字转换为整数吗?
答案 0 :(得分:2)
atoi()
将返回0
。看here。
字符串"score: 34"
无法转换为有效的int
。因此atoi()
会返回0
。
如果您的字符串中的34
之后没有其他内容,则可以
printf("score: %d\n",atoi(conv + 7));
这会给34
。 conv + 7
指向字符串"34"
。它相当于conv + strlen("score: ")
。
使用strtol()
代替atoi()
可能会更好。
您可以使用strtol()
更轻松地找到确实出错的地方。
您可以像
一样使用它long rv=strtol(conv, &ptr, 10);
其中ptr
的类型为char *
或仅为
rv=strtol(conv, NULL, 10);
如果此处conv
为"score: 34"
,则会返回0
,ptr
将指向conv
的开头。
请注意,strtol()
会返回long
而非int
。
如果int
的范围小于long
的范围,您可能需要检查返回的值是否大于int
的最大值INT_MAX
签名int。 INT_MAX
位于limits.h
。
如果由于字符串中的数字太大而无法在long
中表示而发生溢出,则errno
将设置为ERANGE
(它在{{1}中}})。
errno.h
答案 1 :(得分:0)
您正在尝试使用atoi
,根据文档说明:
如果str中的第一个非空白字符序列不是有效的整数,或者由于str是空的或者只包含空白字符而不存在这样的序列,则不执行转换并返回零。
您可以理解,您的代码转换无效。
以下是一些可行的示例代码:
正确使用atoi
:
char conv[20]="34";
printf("score: %d\n",atoi(conv)); //this prints 'score: 34'
使用strpbrk
:
char conv[20]="score: 34";
char breakset[] = "0123456789";
printf("score: %d\n",atoi(strpbrk(conv, breakset))); //this prints 'score: 34'