簡體   English   中英

帶字符串的 Printf 不起作用(2 種方式:函數返回值和一個值)

[英]Printf with string does not work(2 ways: function return value and just a value)

所以,我的問題是每當我想打印 %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: %s\n", 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] = '\0';
    memset(binary, 0, size);
    do{
        remainder = n % 2;
        n /= 2;
        binary[i] = remainder + '0';
        i--;
    }while(n);
    printf("decToBinary = %s\n", 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() 函數中,函數返回值的每個元素的 printf 工作正常,即使我不知道它是如何工作的,因為據我所知,該函數被調用了 33 次,返回值是 33次,在這里我只是一個一個地閱讀。 我認為這是不好的做法。
  • (4) 所以我將函數的返回值復制到變量 binNum 並嘗試使用 %s 顯示它,但再次顯示空字符串。
  • (5) 與變量相同,但使用“for”循環和 %c。 也沒有工作

所以,我的問題是如何管理這些問題?

如果你稍微改變你的代碼

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

您將在結果中看到領先的'\\0'

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計數,因此根據輸入,您可能無法到達數組的開頭。

你可以試試return binary+i+1; decToBinary 這將返回一個指向您最后寫入的字符的指針。 請注意,您不應迭代結果的size字符,而應迭代到'\\0

這不是最終的解決方案,因為您使用mallocdecToBinary分配字符數組。 這意味着您應該返回從malloc獲得的指針並在調用函數中調用free

為此,您可以使用一個額外的循環,將索引i+1'\\0'所有字符復制到數組的開頭。

    for(i++, j=0; binary[i]; i++, j++) {
        binary[j] = binary[i];
    }
    binary[j] = '\0';

    /* ... */

    return binary;

補充說明:

像這樣的代碼會造成內存泄漏,因為您不會free重復調用decToBinary的結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM