Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数字输入到字符串C中,不带stdio 我想知道如何在没有标准C或C++函数的情况下得到数字到字符串,例如: char str[20]; int num = 1234; // How to convert that number to string (str)?_C++_C - Fatal编程技术网

将数字输入到字符串C中,不带stdio 我想知道如何在没有标准C或C++函数的情况下得到数字到字符串,例如: char str[20]; int num = 1234; // How to convert that number to string (str)?

将数字输入到字符串C中,不带stdio 我想知道如何在没有标准C或C++函数的情况下得到数字到字符串,例如: char str[20]; int num = 1234; // How to convert that number to string (str)?,c++,c,C++,C,谢谢。将其逐字符转换,例如字符串的最后一个字符是“4”,前一个字符是“3”,依此类推。使用数学来确定字符,创建“4321”字符串然后旋转它可能更容易。要获得最低数字,请使用num%10。要将数字转换为字符,请添加'0'。要在处理后删除最低数字,请除以10:num/=10。重复此操作直到完成。使用C(而不是C++) 假设您正在为str预分配缓冲区,如您的问题所示: char *itostr(int num, char *str) { int len = 1; long tmp =

谢谢。

将其逐字符转换,例如字符串的最后一个字符是“4”,前一个字符是“3”,依此类推。使用数学来确定字符,创建“4321”字符串然后旋转它可能更容易。

要获得最低数字,请使用
num%10
。要将数字转换为字符,请添加
'0'
。要在处理后删除最低数字,请除以10:
num/=10。重复此操作直到完成。

使用C(而不是C++) 假设您正在为
str
预分配缓冲区,如您的问题所示:

char *itostr(int num, char *str) {
    int len = 1;
    long tmp = num;
    int sign = num < 0;
    if (sign) {
        str[0] = '-';
        tmp = -tmp;
    }
    while (num/=10) ++len;
    str[len+sign] = 0;
    while (len--) {
        str[len+sign] = '0'+tmp%10;
        tmp /= 10;
    }
    return str;
}
char*itostr(int num,char*str){
int len=1;
长tmp=num;
int符号=num<0;
如果(签名){
str[0]='-';
tmp=-tmp;
}
而(num/=10)+len;
str[len+符号]=0;
而(len--){
str[len+符号]=“0”+tmp%10;
tmp/=10;
}
返回str;
}

一种简单的方法是留下大量前导零。我喜欢它,因为它只使用基本代码,不需要任何动态内存分配。因此,速度也应该非常快:

char * convertToString(int num, str) {
    int val;

    val = num / 1000000000; str[0] = '0' + val; num -= val * 1000000000;
    val = num / 100000000;  str[1] = '0' + val; num -= val * 100000000;
    val = num / 10000000;   str[2] = '0' + val; num -= val * 10000000;
    val = num / 1000000;    str[3] = '0' + val; num -= val * 1000000;
    val = num / 100000;     str[4] = '0' + val; num -= val * 100000;
    val = num / 10000;      str[5] = '0' + val; num -= val * 10000;
    val = num / 1000;       str[6] = '0' + val; num -= val * 1000;
    val = num / 100;        str[7] = '0' + val; num -= val * 100;
    val = num / 10;         str[8] = '0' + val; num -= val * 10;
    val = num;              str[9] = '0' + val;
                            str[10] = '\0';

    return str;
}
当然,您可以对此做很多调整—修改目标数组的创建方式是可能的,添加一个表示修剪前导0的布尔值也是可能的。我们可以使用循环来提高效率。以下是改进后的方法:

void convertToStringFancier(int num, char * returnArrayAtLeast11Bytes, bool trimLeadingZeros) {
    int divisor = 1000000000;
    char str[11];
    int i;
    int val;

    for (i = 0; i < 10; ++i, divisor /= 10) {
        val = num / divisor;
        str[i] = '0' + val;
        num -= val * divisor;
    }
    str[i] = '\0';

    // Note that everything below here is just to get rid of the leading zeros and copy the array, which is longer than the actual number conversion.
    char * ptr = str;
    if (trimLeadingZeros) {
        while (*ptr == '0') { ++ptr; }
        if (*ptr == '\0') { // handle special case when the input was 0
            *(--ptr) = '0';
    }
    for (i = 0; i < 10 && *ptr != '\0'; ++i) {
    while (*ptr != '\0') {
        returnArrayAtLeast11Bytes[i] = *ptr;
    }
    returnArrayAtLeast11Bytes[i] = '\0';
}
void convertToStringFancier(int-num,char*returnArrayAtleast11字节,bool-trimming零){
整数除数=100000000;
char-str[11];
int i;
int-val;
对于(i=0;i<10;++i,除数/=10){
val=num/除数;
str[i]=“0”+val;
num-=val*除数;
}
str[i]='\0';
//请注意,下面的所有内容都只是为了去掉前导零并复制数组,这比实际的数字转换要长。
char*ptr=str;
如果(微调零){
而(*ptr=='0'){++ptr;}
if(*ptr=='\0'){//处理输入为0时的特殊情况
*(-ptr)='0';
}
对于(i=0;i<10&&*ptr!='\0';++i){
而(*ptr!='\0'){
返回数组至少11字节[i]=*ptr;
}
返回数组至少11字节[i]='\0';
}
适用于所有
int
包括
int\u MIN
的“接受答案后”选项

static char *intTostring_helper(int i, char *s) {
  if (i < -9) {
    s = intTostring_helper(i/10, s);
  }
  *s++ = (-(i%10)) + '0' ;
  return s;
}

char *intTostring(int i, char *dest) {
  char *s = dest;
  if (i < 0) {  // If non 2s compliment, change to some IsSignBitSet() function.
    *s++ = '-';
  }
  else {
    i = -i;
  }
  s = intTostring_helper(i, s);
  *s = '\0';
  return dest;
}
static char*intTostring\u助手(inti,char*s){
如果(i<-9){
s=intTostring_辅助程序(i/10,s);
}
*s++=((i%10))+'0';
返回s;
}
char*intTostring(inti,char*dest){
char*s=dest;
如果(i<0){//如果非2s补语,则更改为某些IsSignBitSet()函数。
*s++='-';
}
否则{
i=-i;
}
s=intTostring_助手(i,s);
*s='\0';
返回目的地;
}

查看提示:在循环中除以10,每个除法给出一个数字。“0”+2=“2”正如Chad指出的,需要一个除法和一个模(%)。此时,可能已经有人为您做了。@CharlieBurns、mod和divide都是必需的:)@Chad mod和div对于转换为二进制、八进制或十六进制字符串不是必需的,只是对于十进制字符串(未指定基数)和其他非2次幂次的2次恭维
INT\u MIN
。感谢您捕捉到这一点,@chux。该代码现在被编辑为适用于所有情况,包括INT\u MIN。(假设
sizeof long
sizeof INT
)稍后注意:如果
sizeof long
==
sizeof int
则声明
tmp
long
(C99及更高版本)。您后面的说明在
sizeof long long>size int
时有效,但在大小相同时无效。在大多数实现中确实如此。@chux,同意!我们必须始终了解目标平台上的数据类型大小,否则就要准备定义智能条件处理它们!干杯。当返回指向priv的指针时ate存储,确保它有一个非自动的存储类。我添加了
static
关键字来实现这一点。当然,请注意,结果不是线程安全的,因为两个线程在使用同一个私有存储时会发生冲突。@RBerteig坦白地说,我把它放在那里了,因为我已经用勺子喂了一个线程答案似乎是家庭作业问题。我在那里留下了评论,但留下了空间(至少在第一个解决方案中)让海报应用他们自己的解决方案。自从我热衷于使用C标准以来,C标准已经发生了很大的变化,但至少在那时,返回堆栈存储是完全可以接受的,只要它在任何其他修改堆栈之前被使用或复制。我同意OP显然是一个家庭作业问题。然而,在返回指向“乌托邦”可能已经奏效,但它从未真正得到认可。即使在早期,问题是知道没有任何东西可以修改堆栈中的那一部分。尽管如此,我仍然认为,包含已知错误的答案对网站没有帮助。当然,原创海报可能没有什么希望。我更担心的是在明年的课堂上更巧妙地使用谷歌(也称为使用谷歌)并且得到了一个错误的答案……@RBerteig我想我们都会同意,未来搜索谷歌、阅读我的答案、阅读我的代码并喜欢复制它的用户数量非常少,而不会注意到我在内联中留下的关于糟糕编程实践的评论。不过,我理解你对makin的看法g它对后代来说是非常可行的,所以我删除了有问题的代码。当然,代码现在假设函数的使用者将传递一个足够大的数组。无论是线程/静态、数组大小还是自动,总有一些折衷。。。