我在C中编写一个程序,只有当该字符串的第一个字符是减号时才会将n个字符的字符串转换为整数。该计划如下:
#include <string.h>
#include <stdio.h>
#include <math.h>
int StringToInt(char *string){
int i=0;
int integer=0;
int length = strlen(string);
if (string[0]=='-'){
for (i=1; i<length; i++){
integer += (string[i]-48)*pow(10, (length-1-i));
}return (integer*(-1));
}else{
return 0;
}
}
当我用一个字符串长度为奇数值的字符串调用上面的函数时,我的程序工作正常,否则返回正确的值但递减1。现在我用一个例子来说明一点:假设我创建了一个名为&#34; Number&#34;的字符串。我为此分配号码&#34; -234&#34;。如果我们将此字符串放在上面的函数中,字符串的长度将计算为4.在这种情况下,函数不会返回-234,而是返回-233。如果,而不是-234,我已经为字符串分配了一个类似&#34; -1456&#34;的数字,该函数将返回正确的数字。
答案 0 :(得分:2)
我很确定这只是错误的四舍五入。当您将0.999999转换为int时,您得到0.因此,任何导致数字为2047.999999的浮点错误都将被解释为2047而不是更准确的2048,这看起来会减少1。
在评论中建议John Bollinger,只需将每个字符添加到当前值的10倍:
#include <string.h>
#include <stdio.h>
int string_to_int(char *string) {
int i=0;
int integer=0;
int length = strlen(string);
if (string[0] == '-') {
for (i=1; i<length; i++) {
integer = 10 * integer + string[i]-'0';
}
return -integer;
} else {
return 0;
}
}
int main(int argc, char **argv) {
if (argc < 2)
return 1;
printf("Result: %d\n", string_to_int(argv[1]));
return 0;
}
我更喜欢说'0'而不是48,因为它澄清了你的意图(将一个字符转换为它代表的数字)。
答案 1 :(得分:1)
我建议使用下一个代码,它基于评论中提出的建议:
#include <string.h>
#include <stdio.h>
int StringToInt(const char* string){
int lenght = strlen(string);
if (lenght && string[0] == '-'){
int integer = 0;
for (int i = 1; i < lenght; ++i) {
// Check if it is not a character valid.
if (string[i] < '0' || string[i] > '9') {
// Returns the integer processed so far.
return -integer;
}
integer = 10 * integer + string[i] - '0'; // Like John Bollinger suggests
}
return -integer;
} else {
return 0;
}
}
int main(int argc, char **argv) {
fprintf(stderr, "%d\n", StringToInt(""));
fprintf(stderr, "%d\n", StringToInt("-123"));
fprintf(stderr, "%d\n", StringToInt("-1736734"));
fprintf(stderr, "%d\n", StringToInt("-1999"));
fprintf(stderr, "%d\n", StringToInt("-123"));
fprintf(stderr, "%d\n", StringToInt("-234"));
fprintf(stderr, "%d\n", StringToInt("-180."));
fprintf(stderr, "%d\n", StringToInt("-200.99"));
fprintf(stderr, "%d\n", StringToInt("-aaa"));
const char* msg = "-301";
fprintf(stderr, "%d\n", StringToInt(msg));
return 0;
}
我建议检查这个角色是否无效(即:它不在&#39; 0&#39;和&#39; 9&#39;)之间:
if (string[i] < '0' || string[i] > '9') {
// Returns the integer processed so far.
return -integer;
}
找到无效字符后,返回到目前为止处理的整数。
输出:
0
-123
-1736734
-1999
-123
-234
-180
-200
0
-301