带有字符串的Printf不起作用(有两种方式:函数返回值和仅返回一个值)



所以,我的问题是,每当我想打印%s(char*)时,程序都会显示一个空字符串。这是我的代码,我对程序中评论中的所有问题进行了编号

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *decToBinary(char *num, int size);
int main(){
char *n;
n = (char *)malloc(5);  
//memset(n, 0, 5);
printf("Enter n: ");
// getting the number as a string
scanf("%s", n);
int size = 33;
char *binNum;
binNum = (char *)malloc(size);  
memset(binNum, 0, size);
//copying the (char *) which is returned by function to char binNum[33] 
strcpy(binNum, decToBinary(n, size));
//sprintf(binNum, "%s", decToBinary(n, size));
// Printing the FUNCTION variable as a character in a loop. WORKS(WHY?)(3)
for(int i = 0; i < size; i++){
printf("With function: %c", decToBinary(n, size)[i]);
}
//Printing the variable binNum as a string <--------- DOES NOT WORK. JUST EMPTY MESSAGE(WHY?)(4)
printf("In main: %sn", binNum);
// Printing the variable binNum as a character in a loop <------------ DOES NOT WORK(5)
for(int i = 0; i < size; i++){
printf("with variable: %c", binNum[i]);
}
printf("n");
}
char *decToBinary(char *num, int size){
// convert decimal to binary
int i = size - 2;
int remainder;
int decimal;
char *binary;
int n;
n = atoi(num); 
binary = (char *)malloc(size);
binary[size - 1] = '';
memset(binary, 0, size);
do{
remainder = n % 2;
n /= 2;
binary[i] = remainder + '0';
i--;
}while(n);
printf("decToBinary = %sn", binary); // does not work as string (1)
for(int j = 0; j < size; j++){
printf("%c", binary[j]); // but this works(2)
}
printf("n");
return binary;   
}
  • (1)函数中不显示字符串。即使我冲洗使用"\n"缓冲
  • (2) 但是当我使用"for"循环并显示数组的每个元素时使用%c-它有效。但这不是一个让它发挥作用的好方法
  • (3) 在main()函数中,从该函数运行良好,尽管我不知道它是如何实现的工作,因为据我所知,该函数被调用33次该值被返回33次,这里我只读取了一个元素一我认为这是不好的做法
  • (4) 所以我把函数的返回值复制到变量binNum,并尝试使用%s显示它,但空字符串再次为显示
  • (5) 与变量相同,但使用"for"循环和%c。也做了不起作用

所以,我的问题是如何管理这些问题?

如果您将代码更改一点

for(int j = 0; j < size; j++){
printf("%c 0x%02xn", binary[j], binary[j]); // but this works(2)
}

您将在结果中看到领先的''

With function: 1decToBinary =
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
1 0x31
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
1 0x31
1 0x31
0x00

所以你的函数decToBinary有问题。

您使用i从数组的末尾开始计数,因此根据输入的不同,您可能无法到达数组的开头。

您可以在decToBinary的末尾尝试return binary+i+1;。这将返回一个指向您上次写入的字符的指针。请注意,不应迭代结果的size个字符,而应最多迭代一个'

这不是最终解决方案,因为您使用malloc来分配decToBinary中的字符数组。这意味着您应该返回从malloc获得的指针,并在调用函数中调用free

为了实现这一点,您可以使用一个额外的循环,将从索引i+1''的所有字符复制到数组的开头。

for(i++, j=0; binary[i]; i++, j++) {
binary[j] = binary[i];
}
binary[j] = '';
/* ... */
return binary;

附加说明:

这样的代码会造成内存泄漏,因为您没有freedecToBinary:的重复调用的结果

for(int i = 0; i < size; i++){
printf("With function: %c", decToBinary(n, size)[i]);
}

最新更新