【发布时间】:2025-12-29 09:15:07
【问题描述】:
我需要将 Integer 转换为 Char,我只能使用没有数组索引的指针。 Char 数组必须是动态分配的。任何人都可以查看我的代码并告诉我我做错了什么吗?
#include <stdio.h>
#include <stdlib.h>
int main(){
int myNumber = 1234;
char *myString = (char*)malloc(2 * sizeof(char)); //memory for 1 char and '\0'
int i = 0; //parameter for tracking how far my pointer is from the beggining
if (myNumber < 0){
*myString = '-'; //if myNumber is negative put '-' in array
*myString = *(myString + 1); //move pointer to next position
i++;
}
while (myNumber != 0){
myString = (char*)realloc(myString, (i + 2) * sizeof(char)); //increse memory =+1
*myString = (myNumber % 10) + '0'; //put digit as char to array
myNumber /= 10;
*myString = *(myString + 1); //move pointer to next position
i++;
}
*myString = '\0'; //mark end of string
*myString = *(myString - i); //move pointer back to the beggining of string
printf("\n%s", *myString); // print char array (not working..)
return 0;
}
我知道有更好的方法将 Int 转换为 String (sprintf),但我的任务就是这样做。 在上面的代码中,我将 Int 中的数字倒过来,可以按正确的顺序完成吗?
编辑。如 cmets 部分所述:
*myString = *(myString + 1);
错了,正确的将指针重定向一个空格的方法是:
myString++;
与:
*myString = *(myString - i); //wrong
myString -=i; //ok
编辑2: 现在我的代码可以工作了!但我需要考虑如何更正数字的顺序。
#include <stdio.h>
#include <stdlib.h>
int main(){
int myNumber = 1234;
char *myString = (char*)malloc(2 * sizeof(char)); //memory for 1 char and '\0'
char * position = myString;
int i = 0;
if (myNumber < 0){
*position = '-'; //if myNumber is negative put '-' in array
position += i; //move pointer to next position
i++;
}
while (myNumber != 0){
myString = (char*)realloc(myString, ((i + 2) * sizeof(char))); //increse memory =+1
position = myString + i; // getting current position after reallocating
*position = (myNumber % 10) + '0'; //put digit to array
myNumber /= 10;
position++; //move pointer to next position
i++;
}
*position = '\0'; //mark end of string
char * temp = myString;
while (*temp != '\0'){
printf("%c", *temp); // print char array (not working..)
temp++;
}
return 0;
}
Edit 3 问题已解决,感谢 cmets,我正在发布代码以防有人会寻找类似的解决方案。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// move each character in array one place to the right
// we need to make place for new character on the left
void moveArrayElementsRight(char *ptr, int len) {
for (int j = len; j > 1; j--) {
*(ptr + j - 1) = *(ptr + j - 2);
}
}
void intToStr(int myNumber, char* myString){
int i = 1; //track size of allocated memory
bool isMinus = false;
if (myNumber < 0) {
myNumber *= -1; //without this (myNumber % 10) + '0' wont work
isMinus = true;
}
if (myNumber == 0){ //special case for 0
myString = (char*)realloc(myString, ((i + 1) * sizeof(char)));
*myString = '0';
*(myString + 1) = '\0';
}
while (myNumber != 0) {
myString = (char*)realloc(myString, ((i + 1) * sizeof(char))); //increse memory =+1 for next digit
i++;
moveArrayElementsRight(myString, i);
*myString = (myNumber % 10) + '0'; //put digit to array
myNumber /= 10;
}
if (isMinus) {
myString = (char*)realloc(myString, ((i + 1) * sizeof(char))); //increse memory =+1 for '-' sign
i++;
moveArrayElementsRight(myString, i);
*myString = '-'; //put sign at the beginning
}
}
int main() {
int numberToConvert = -10;
char *numberAsString = (char*)malloc(sizeof(char)); //create empty array, with place only for '\0'
*numberAsString = '\0'; //mark the end of array
intToStr(numberToConvert, numberAsString);
printf("%s", numberAsString);
return 0;
}
【问题讨论】:
-
如果您的代码有效,请考虑将其发布到Code Review。
-
您的实际问题是什么?您在寻找Code Review 吗?
-
你似乎没有掌握指针和它所指向的东西之间的区别,就像这个片段
*myString = *(myString - i); //move pointer back to the beggining of string一样。还有其他小问题,但你必须先解决这个问题。 -
问题是你没有移动任何指针。
*myString不是一个指针,实际上你上面的一行正在使用完全相同的表达式*myString来操作一个字符。同一个*myString怎么可能既是指针又是字符? -
如果您知道要转换的数字(连同其基数),您可以立即从中得出您需要分配的字符数。提示:阅读对数函数。
标签: c pointers dynamic-arrays dynamic-allocation