结果在字符串到整数之间的转换期间减1(并且只有特定的字符串长度值)

时间:2016-06-08 16:17:48

标签: c string

我在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;的数字,该函数将返回正确的数字。

2 个答案:

答案 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