2013-06-24 82 views
0

,我對我自己的實踐C編程,我被要求寫一個整數到字符串函數的垃圾。我的代碼如下。正確的功能輸出導致的printf

一切正常,直到我試圖打印出主函數中的函數返回。當「自動」在Visual Studio中顯示我時,我有正確的返回值,但它在printf函數中變得混亂。有什麼建議?謝謝。

#include <stdio.h> 

char* itob(int n, char s[100], int b); 
char reverse(char s[100],char i); 
int main(void) 
{ 
    int n,b,c=0; 
    char* str; 
    char s[100]; 
    ... 

    str=itob(n,s,b); 
    printf("%s",str); //wrong 
    main(); 
} 

char* itob(int n, char s[100], int b) 
{ 
int i=100,c,firstdig,a; 
char str[100]; 
if(b==8) 
    printf("0"); 
else if(b==16) 
    printf("0x"); 

do 
{ 
    c=n%b; 
    if(c>9) 
      s[i--]=c-10+'A'; 
     else 
      s[i--]=c+'0'; 
} while((n/=b)>0); 
a=0; 
c=i+1; 
while(c!=101) 
    { 
     str[a]=s[c]; 
     a++; 
     c++; 
    } 
str[a]='\0';  
return str; 

}

+5

請問您可以顯示'itob()'的內容嗎? 「搞砸」涉及什麼?你看到字符串的一部分,然後是垃圾還是全是垃圾?你NULL是否終止你的字符串? – Jimbo

+3

此外,你似乎遞歸調用'main()'?是對的嗎? – Jimbo

+0

不,調用'main()'遞歸是一個畸變,它甚至在C++中被禁止。 – Mathuin

回答

1

這很難不完整itob功能來回答的str至少定義,可以參考,而不是堆在棧上的變量,因此該功能時, itob()返回時,對該內存的引用將丟失。

+0

那麼我該怎麼做才能確保我對堆有正確的參考? 'itob()'函數在我的代碼中返回了一個指針,所以我通過引用來傳遞它,或者不是嗎? – user2309838

+0

你已經通過'個char [100]',這是對的,但你已經定義了一個'焦炭海峽[100]''裏面itob()'。這是一個本地數組,並且該內存在'itob'函數之外不可及。你有兩個選擇:要麼你定義'字符*海峽=的malloc(100 *的sizeof(char)的)',然後返回STR,或者您也可以通過另一種說法爲'itob()',例如'字符str_dest [100] '作爲參考,那麼'itob()'可以使用它來代替它自己的目標字符串。 – user2492779

+0

現在的代碼工作!謝謝! – user2309838

0

雖然試圖保留您的編碼風格的味道,下面是一個候選解。你需要扭轉itobsstr的作用。 'str'是你的工作緩衝區,'s'是傳入並返回的目的地。還初始化i到99,而不是100保持在str之內。

#include <stdio.h> 
#include <stdio.h> 

char* itob(int n, char s[100], int b); 
char reverse(char s[100], char i); 

int main(void) { 
    int n; 
    int b; 
    // int c = 0; 
    char* str; 
    char s[100]; 
    // ... 
    b = 8; 
    n = 1234; 
    str = itob(n, s, b); 
    printf("%s\n", str); //wrong 
    b = 16; 
    str = itob(n, s, b); 
    printf("%s\n", str); //wrong 
    // main(); 
} 


char* itob(int n, char s[100], int b) 
{ 
int i=100-1,c/*,firstdig*/,a; 
char str[100]; 
if(b==8) 
    printf("0"); 
else if(b==16) 
    printf("0x"); 

do 
{ 
    c=n%b; 
    if(c>9) 
      str[i--]=c-10+'A'; 
     else 
      str[i--]=c+'0'; 
} while((n/=b)>0); 
a=0; 
c=i+1; 
while(c!=(101-1)) 
    { 
     s[a]=str[c]; 
     a++; 
     c++; 
    } 
s[a]='\0'; 
return s; 
}