【问题标题】:How to convert a part of a string into int in C? [closed]如何在C中将字符串的一部分转换为int? [关闭]
【发布时间】:2017-10-22 06:14:27
【问题描述】:

我有如下代码行,

char conv[20]="score: 34";

我想提取“conv”字符串中的数字(34)并将其转换为整数。我使用了“atoi”功能。但结果为 0。

printf("score: %d\n",atoi(conv)); //this prints 'score: 0'

有人可以帮我把字符串中的数字转换成整数吗?

【问题讨论】:

  • atoi() 之类的函数只有在字符串是纯数字时才有效。您必须先找到号码。您可以使用 strpbrk(conv,"0123456789") 之类的函数来执行此操作。
  • 为了更深入地了解杂草,您需要将+- 作为字符包含在要转换的字符串的开头并检查下一个字符是否为0-9。还推荐strtol 而不是atoiatoi 无法验证是否已成功转换。
  • 如果您知道字符串具有该格式,您也可以使用sscanf(conv, "score: %d", &n);
  • @TomKarzes 它有效.. 谢谢..

标签: c string type-conversion int atoi


【解决方案1】:

如果无法执行转换,atoi() 将返回 0。看here

字符串"score: 34" 无法转换为有效的int。所以atoi() 返回0

如果你的字符串中34 之后没有其他内容,你可以这样做

printf("score: %d\n",atoi(conv + 7));

这将给出34conv + 7 指向字符串 "34"。相当于conv + strlen("score: ")

在这里使用strtol() 而不是atoi() 可能会更好。

您可以使用strtol() 更轻松地找出问题所在。

你可以像这样使用它

long rv=strtol(conv, &ptr, 10);

其中ptr 的类型为char * 或只是

rv=strtol(conv, NULL, 10);

如果此处conv"score: 34",则返回0ptr 将指向conv 的开头。

请注意,strtol() 返回的是 long,而不是 int

如果int 的范围小于long 的范围,您可能需要检查返回值是否大于最大的int,即INT_MAX 用于有符号整数。 INT_MAXlimits.h 中。

如果由于字符串中的数字太大而无法在long 中表示而发生溢出,则errno 将设置为ERANGE(在errno.h 中)。

long rv=strtol(str, NULL, 10);
if(rv>INT_MAX || rv<INT_MIN || errno==ERANGE)
{
    perror("something is wrong.");
}

【讨论】:

  • 很好的解释。我明白了。谢谢..
【解决方案2】:

您正在尝试使用atoi,根据文档所述:

如果 str 中的第一个非空白字符序列不是有效整数,或者由于 str 为空或仅包含空白字符而不存在此类序列,则不执行转换并返回零。

所以你可以理解,你的代码有一个无效的转换。

以下是一些可行的示例代码:

  1. 正确使用atoi

    char conv[20]="34";
    printf("score: %d\n",atoi(conv)); //this prints 'score: 34'
    
  2. 使用strpbrk

    char conv[20]="score: 34";
    char breakset[] = "0123456789";
    printf("score: %d\n",atoi(strpbrk(conv, breakset))); //this prints 'score: 34'
    

【讨论】:

  • 那是 C++ 代码。 OP 的问题上有一个 C 标签,而不是 C++。
  • @jwdonahue 你是对的,我已经把它改成了 C 代码
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多