我需要将整数转换为字符串,无论是负数还是正数。 到目前为止,我已经可以使用以下代码将正整数转换为字符串。 但不是负面的。我如何正确处理它们以将其转换为字符串。 这是我正在使用的代码。
谢谢
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
答案 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;
}