回答
如果我理解正确你的问题:
#include <stdio.h>
int main()
{
int i = atoi(" 3 ");
printf("%d", i);
return 0;
}
atoi
将忽略任何空白,直到它找到一个数字,当它检测到一个非数字字符就会停止。
的评论说,几乎一切,给你详细介绍有关atoi
,sscanf
和strtol
。这里我有一些示例字符串和这些函数返回的结果。因为不是每个字符串都转换成功我添加了一个扩展实现strtol
下面这个。生成此输出的代码也在下面给出see it online in action at ideone。
的atoi:字符串与非编号开始进行评估,以
0
。根本没有错误信息。0: atoi with "3" to integer: +3 1: atoi with " 3 " to integer: +3 2: atoi with " -3 " to integer: -3 3: atoi with "str 3 " to integer: +0 4: atoi with "str-3 " to integer: +0 5: atoi with " 3str" to integer: +3 6: atoi with " -3str" to integer: -3 7: atoi with "str-3str" to integer: +0 8: atoi with "s-r-3str" to integer: +0
sscanf的:与
%d
就叫:同样在这里,但返回匹配的项目作为计数,所以0
将指示错误。0: sscanf with "3" to integer: +3 | itemCount = 1 1: sscanf with " 3 " to integer: +3 | itemCount = 1 2: sscanf with " -3 " to integer: -3 | itemCount = 1 3: sscanf with "str 3 " to integer: +0 | itemCount = 0 --> Error! 4: sscanf with "str-3 " to integer: +0 | itemCount = 0 --> Error! 5: sscanf with " 3str" to integer: +3 | itemCount = 1 6: sscanf with " -3str" to integer: -3 | itemCount = 1 7: sscanf with "str-3str" to integer: +0 | itemCount = 0 --> Error! 8: sscanf with "s-r-3str" to integer: +0 | itemCount = 0 --> Error!
与strtol:同样在这里,但返回错误代码为
errno
的范围溢出。另外endPtr
是为您提供有关转换的更多详细信息的参数之一。0: strtol with "3" to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a140, EndPtr = 0x7ffc47e9a141, PtrDiff = 1 1: strtol with " 3 " to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a130, EndPtr = 0x7ffc47e9a135, PtrDiff = 5 2: strtol with " -3 " to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a120, EndPtr = 0x7ffc47e9a125, PtrDiff = 5 3: strtol with "str 3 " to integer: +0 | errno = 0, StartPtr = 0x7ffc47e9a110, EndPtr = 0x7ffc47e9a110, PtrDiff = 0 --> Error! 4: strtol with "str-3 " to integer: +0 | errno = 0, StartPtr = 0x7ffc47e9a100, EndPtr = 0x7ffc47e9a100, PtrDiff = 0 --> Error! 5: strtol with " 3str" to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a0f0, EndPtr = 0x7ffc47e9a0f5, PtrDiff = 5 6: strtol with " -3str" to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a0e0, EndPtr = 0x7ffc47e9a0e5, PtrDiff = 5 7: strtol with "str-3str" to integer: +0 | errno = 0, StartPtr = 0x7ffc47e9a0d0, EndPtr = 0x7ffc47e9a0d0, PtrDiff = 0 --> Error! 8: strtol with "s-r-3str" to integer: +0 | errno = 0, StartPtr = 0x7ffc47e9a0c0, EndPtr = 0x7ffc47e9a0c0, PtrDiff = 0 --> Error!
这里是我的strtol
函数的代码,这样就可以解析更多不同的字符串。 my_strtol
的用法与strtol
完全相同。如果你有如下字符串,还有一个帮助函数:"str-str-3"
,因为第一个减号-
不是整数。
my_strtol()实现:
/* Position exactly to integer beginning */
/* e.g. if you have: "str-str-3str " */
/* the returning pointer will point to: */
/* "-3str". */
const char* getNumberPos(const char* str)
{
const char* curChar = str;
/* Iterate through part of integer is there. */
while ( '\0' != curChar
&& !(isdigit(*curChar) || '+' == *curChar || '-' == *curChar))
{
++curChar;
}
/* Check if the sign is part of an integer, */
/* if not use this function recursive! */
if ('+' == *curChar || '-' == *curChar)
{
const char* nextChar = curChar + 1;
if ( '\0' != *nextChar
&& !isdigit(*nextChar))
{
++curChar;
curChar = getNumberPos(curChar);
}
}
return curChar;
}
/* Extended strtol function */
long my_strtol(const char* str, char** endptr, int base)
{
const char* curChar = getNumberPos(str);
return strtol(curChar, endptr, base);
}
my_strtol的结果:的my_strtol
功能与上面给出的所有字符串的工作原理:
0: my_strtol with "3" to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a140, EndPtr = 0x7ffc47e9a141, PtrDiff = 1
1: my_strtol with " 3 " to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a130, EndPtr = 0x7ffc47e9a135, PtrDiff = 5
2: my_strtol with " -3 " to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a120, EndPtr = 0x7ffc47e9a125, PtrDiff = 5
3: my_strtol with "str 3 " to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a110, EndPtr = 0x7ffc47e9a115, PtrDiff = 5
4: my_strtol with "str-3 " to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a100, EndPtr = 0x7ffc47e9a105, PtrDiff = 5
5: my_strtol with " 3str" to integer: +3 | errno = 0, StartPtr = 0x7ffc47e9a0f0, EndPtr = 0x7ffc47e9a0f5, PtrDiff = 5
6: my_strtol with " -3str" to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a0e0, EndPtr = 0x7ffc47e9a0e5, PtrDiff = 5
7: my_strtol with "str-3str" to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a0d0, EndPtr = 0x7ffc47e9a0d5, PtrDiff = 5
8: my_strtol with "s-r-3str" to integer: -3 | errno = 0, StartPtr = 0x7ffc47e9a0c0, EndPtr = 0x7ffc47e9a0c5, PtrDiff = 5
下面的代码显示的是测试代码为所有四个功能生成输出。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
int main()
{
/* Loop index */
int idx;
/* Declare and initialize char arrays. */
char array[] = { "3" };
char arrayI[] = { " 3 " };
char arrayII[] = { " -3 " };
char arrayIII[] = { "str 3 " };
char arrayIV[] = { "str-3 " };
char arrayV[] = { " 3str" };
char arrayVI[] = { " -3str" };
char arrayVII[] = { "str-3str" };
char arrayVIII[] = { "s-r-3str" };
/* Save each array in one array for iteration purposes. */
const char* const arrays[] = { array,
arrayI,
arrayII,
arrayIII,
arrayIV,
arrayV,
arrayVI,
arrayVII,
arrayVIII };
/* Get size of that array. */
const int arraysSize = sizeof(arrays)/sizeof(char*);
/* atoi(): Does not detect errors! */
for (idx = 0; idx < arraysSize; ++idx)
{
int integer = atoi(arrays[idx]);
printf("%d: atoi with \"%s\" %*s to integer: %+d\n",
idx,
arrays[idx],
8 - strlen (arrays[idx]),
"",
integer);
}
printf("\n");
/* sscanf(): Error detection by using the matched item count. */
for (idx = 0; idx < arraysSize; ++idx)
{
int integer = 0;
int itemCount = sscanf(arrays[idx], "%d", &integer);
printf("%d: sscanf with \"%s\" %*s to integer: %+d | itemCount = %d",
idx,
arrays[idx],
8 - strlen (arrays[idx]),
"",
integer,
itemCount);
if (0 == itemCount)
{
printf(" --> Error!");
}
printf("\n");
}
printf("\n");
/* strtol(): Error detection by using errno and returned end pointer. */
for (idx = 0; idx < arraysSize; ++idx)
{
char* endPtr = NULL;
ptrdiff_t ptrDiff = 0;
errno = 0;
/* You have to check if the long can be stored in the int, not done here! */
int integer = (int) strtol(arrays[idx], &endPtr, 10);
ptrDiff = endPtr - arrays[idx];
printf("%d: strtol with \"%s\" %*s to integer: %+d | errno = %d, StartPtr = %p, EndPtr = %p, PtrDiff = %ld",
idx,
arrays[idx],
8 - strlen (arrays[idx]),
"",
integer,
errno,
(void*) arrays[idx],
(void*) endPtr,
ptrDiff);
if (0 != errno || 0 == ptrDiff)
{
printf(" --> Error!");
}
printf("\n");
}
printf("\n");
/* my_strtol: Same as strtol here. */
for (idx = 0; idx < arraysSize; ++idx)
{
char* endPtr = NULL;
ptrdiff_t ptrDiff = 0;
errno = 0;
/* You have to check if the long can be stored in the int, not done here! */
int integer = (int) my_strtol(arrays[idx], &endPtr, 10);
ptrDiff = endPtr - arrays[idx];
printf("%d: my_strtol with \"%s\" %*s to integer: %+d | errno = %d, StartPtr = %p, EndPtr = %p, PtrDiff = %ld",
idx,
arrays[idx],
8 - strlen (arrays[idx]),
"",
integer,
errno,
(void*) arrays[idx],
(void*) endPtr,
ptrDiff);
if (0 != errno || 0 == ptrDiff)
{
printf(" --> Error!");
}
printf("\n");
}
return 0;
}
嗨@AgrimTyagi如果这或任何答案已解决您的问题,请考虑[接受它](https://meta.stackexchange.com/q/5234/179419)点击复选标记。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 –
- 1. 如何使用atoi()将char数组的元素转换为int?
- 2. 如何将数组元素转换为Python中的整数
- 3. 如何将char数组转换为整数或双精度?
- 4. 如何将char [HEX]数组转换为整数?
- 5. 将TCHAR数组转换为char数组
- 6. 将char数组转换为int数组?
- 7. 将数组从unsigned char *转换为char *
- 8. 如何将可变数量的char数组元素转换为字符串
- 9. 如何整数转换成等于整数元素的数组
- 10. 将整数数组转换为char数组,每个整数每3位数
- 11. 将char转换为整数表示c#
- 12. 当将字符串数组转换为整数数组时,元素变为0
- 13. 将XML元素转换为数组
- 14. 如何将char数组转换为结构数组?
- 15. 如何将char数组转换为wchar_t数组?
- 16. 将16位整数转换为char数组? (C++)
- 17. 如何将数字的char []转换为整数?
- 18. 如何将数组中的所有元素转换为JavaScript中的整数?
- 19. 将特定的单元格数组元素转换为数组
- 20. 将char数组转换为单个int?
- 21. 将char数组转换为NSString对象
- 22. 将Int转换为Char数组
- 23. 如何将整数文本行转换为整数数组?
- 24. 将整数转换为数组数字
- 25. java整型数组转换为ascii并放入char数组
- 26. 如何将字符串数组转换为整数数组?
- 27. 我将如何将JSONObject的元素转换为单个元素数组?
- 28. 转换矩阵的元素为整数
- 29. 整数如何自动将char转换为ASCII值?
- 30. 我如何将整数转换为char * C++
[转换字符数组到在C INT数]可能的复制(https://stackoverflow.com/questions/10204471/convert-char-array-to-a-int-number-in-c ) – Stargateur
我从字面上将你的标题问题复制并粘贴到谷歌中。 – Stargateur
它是数组内的*字符串*吗?像“30”一样? –