我有一个长字符串,我知道整数的开始和结束位置。我想提取整数并将其存储在变量中。这就是我现在可以做到的方式。
//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);
问题是我可以在一行中执行此操作,而不是使用临时字符串吗?
答案 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)
不,您不能一行完成,源代码行数通常是不相关的指标。唯一重要的是安全性,可读性和性能。 strncpy
和atoi
都是不安全的函数。
然而,正确的方法非常相似:
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);