将负整数转换为字符串时如何处理?

时间:2018-08-16 07:48:35

标签: c string integer logic

我需要将整数转换为字符串,无论是负数还是正数。 到目前为止,我已经可以使用以下代码将正整数转换为字符串。 但不是负面的。我如何正确处理它们以将其转换为字符串。 这是我正在使用的代码。

谢谢

Rajat!

Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.Workbooks.Item("B.xlsm").Close True
    On Error GoTo 0
End Sub

5 个答案:

答案 0 :(得分:1)

在执行其他任何操作之前,请查看n是否为负。如果是这样,请以符号-开始输出(确保len也比其他符号多一个,并且您的字符串化将在以后开始一个字符),使n为正,然后继续之前的操作。

答案 1 :(得分:0)

您必须像其他许多人所说的那样,对“拐角事件”保持警惕:

  • 在int中不能包含负int的正值 int的范围值为[MIN; + MIN -1],例如–2,147,483,648到2,147,483,647,即4字节的整数。 因此,如果您有–2,147,483,648而您* -1,则不会有2,147,483,648,因为它将溢出int容量

  • 您找到int的len的循环是“坏的”,因为您没有在计数中使用负数(但是我想这是本文的目的),并且您也不会使用极端情况0(“ len”值为0,但必须为1)。

那么,如何实现此功能?

1:修正整数计算

size_t len = 1;

for (int n = number;  n <= -10 || 10 <= n; n /= 10) {
    ++len;
}

2:修复“数字转为字符”循环

for (size_t i = 0; i < len; ++i) {
    str[len - i - 1] = abs(number % 10) + '0';
    number /= 10;
}
str[len] = '\0';

在那里。剩下的唯一事情是在开头加上“-”,并为负的案例编号加上一个偏移量。 您可以有一个偏移量变量(如果使用,可以将“ digit to char loop”固定下来),也可以简单地执行“ ++ str”。

在那里,您现在可以自己执行功能,我很乐意为您提供答案。


有趣的是,如果您仅执行以下操作,则可以跳过“ abs”功能:

void tostring(char *str, int number)
{
    char   *digit = "9876543210123456789" + 9;
    size_t len    = 1;

    if (number < 0) {
        // TODO : Put '-' in the first case
        // TODO : Make str to be *str[1]
    }

    for (int n = number;  n <= -10 || 10 <= n; n /= 10) {
        ++len;
    }

    for (size_t i = 0; i < len; ++i) {
        str[len - i - 1] = digit[number % 10];
        number /= 10;
    }
    str[len] = '\0';
}

如果您不了解其工作原理,请花些时间阅读指针的工作原理(尤其是指针算术)。

答案 2 :(得分:0)

我已经通过@Amadan的帮助解决了这个问题。 这是我正在使用的代码。请随时告诉我解决此问题的更好方法。 谢谢 拉贾特

/*
* C Program which Converts an Integer to String & vice-versa
 */
 #include <stdio.h>
 #include <string.h>
 #include <math.h>

 void tostring(char [], int);


 int main()
 {
     char str[10];
     int num, result;

     printf("Enter a number: ");
     scanf("%d", &num);
     tostring(str, num);
     printf("Number converted to string: %s\n", str);


     return 0;
  }

 void tostring(char str[], int num)
 {
     int i, rem, len = 0, n;
     bool flag=0;
     if(num<0)
   {
       n=-num;
       flag=1;
   }
     else
   {
       n=num;
       flag=0;
   }
   while (n != 0)
   {
       len++;

       n /= 10;


    }
   if(flag==1)
    {
        num=-1*num;
        str[0]='-';

     }

    for (i = 0; i < len; i++)
    {

        rem = num % 10;
        num = num / 10;
        if(flag==1)
        {
            str[len - (i)] = rem + '0';

        }
        else
        {
           str[len - (i + 1)] = rem + '0';
        }   



       }
       if(flag==1)
       {
           str[len+1] = '\0';
       }
       else
       {
           str[len] = '\0';
       }



    }

答案 3 :(得分:-1)

只需使用sprintf函数,如下所示,

sprintf(str,"%i",num);

所以修改后的代码将是

#include <stdio.h>
#include <string.h>
#include <math.h>

void tostring(char [], int);


int main()
{
char str[10];
int num, result;

printf("Enter a number: ");
scanf("%d", &num);
//tostring(str, num);
sprintf(str,"%i",num);
printf("Number converted to string: %s\n", str);


return 0;
}

void tostring(char str[], int num)
  {
    int i, rem, len = 0, n;

n =num;
while (n != 0)
{
    len++;
    n /= 10;
}
for (i = 0; i < len; i++)
{
    rem = num % 10;
    num = num / 10;
    str[len - (i + 1)] = rem + '0';
}
str[len] = '\0';
   }

希望这会有所帮助。

答案 4 :(得分:-1)

这里具有可与任何基数一起使用的功能(您只需要找到足够的字符以表示数字),但在一个特殊情况下将不起作用(可以找到大小写吗?)

static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUWXYZ";

static char *reverse(char *s, size_t len)
{
    size_t pos;

    for(pos = 0; pos < len / 2; pos++)
    {
        char tmp = s[pos];

        s[pos] = s[len - pos - 1];
        s[len - pos - 1] = tmp;
    }
    return s;
}

char *toString(char *buff, int n, unsigned base)
{
    int saved = n;
    char *savedbuff = buff;

    n = n < 0 ? -n : n;                       // <= there is one number which will cause problems. Which one?
    do
    {
        *buff++ = Digits[n % base];
        n /= base;
    }while(n);
    if(saved < 0) *buff++ = '-';
    *buff = 0;
    return reverse(savedbuff, buff - savedbuff);
}

int main()
{
    char buff[50];
    printf("%s\n", toString(buff, -255,12)); // 12 base :)
    printf("%s\n", toString(buff, -976,10)); // 10 base 
    printf("%s\n", toString(buff, -976,8));  // or maybe octal ?
    return 0;
}