在C中的一个命令中将字符串的一部分转换为int

时间:2018-11-23 07:58:18

标签: c string parsing

我有一个长字符串,我知道整数的开始和结束位置。我想提取整数并将其存储在变量中。这就是我现在可以做到的方式。

//MY_STRING, INT_START, INT_END are the string, start 
//position of the int and end position respectively.
char * temp;
strncpy(temp, MY_STRING+INT_START, INT_END-INT_START);
int n = atoi(temp);

问题是我可以在一行中执行此操作,而不是使用临时字符串吗?

2 个答案:

答案 0 :(得分:3)

  

我可以在一行中执行此操作,而不使用临时字符串吗?

使用sscanf()可以快速删除没有temp

int n;
//                                  v--- scan width limit
//                                  |    v---------------v
if (sscanf(MY_STRING + INT_START, "%*d", INT_END-INT_START, &n) == 1) {
  puts("Success");
}

更好的代码会考虑溢出问题。


OP的代码不好,因为temp不确定是否指向 string 。它可能缺少空字符

strncpy(temp, MY_STRING+INT_START, INT_END-INT_START);
int n = atoi(temp); // bad

答案 1 :(得分:2)

不,您不能一行完成,源代码行数通常是不相关的指标。唯一重要的是安全性,可读性和性能。 strncpyatoi都是不安全的函数。

然而,正确的方法非常相似:

int strn_to_int (const char* src, size_t n)
{
  char str [LARGE_ENOUGH];
  memcpy(str, src, n);
  str[n] = '\0';
  return strtol(str, NULL, 10);
}

...

int n = strn_to_int (&MY_STRING[INT_START], INT_END-INT_START);