2017-08-15 118 views
-4

我已經寫了這樣的功能,當參數x甚至不能按要求工作時,例如,如果我在主打字中輸入printf("%s",maxCharac(2)),它將打印「aa」並在其旁邊顯示一個額外的字符,但有一個奇數,它正常工作。功能返回意想不到的值

char *maxCharac(int x) 
{ 
    char *str=(char*)malloc(sizeof(char)*x); 
    for(int i=0;i<x;i++) 
    {    
     str[i]='a'; 
    } 
    return str; 
} 
+6

不要忘記0-終止你的字符串。這是問題。重複的鏈接,有人? –

+1

閱讀'printf'的要求。 – juanchopanza

+1

'printf(「%。* s」,2,maxCharac(2))'將字符數組打印爲可能缺少_null字符的「字符串」。 – chux

回答

3

字符串用C需要由NUL末('\0')字符結束,所以你總是有分配了一個額外的空間來存儲。這裏是你的代碼糾正來解決這個問題。

char *maxCharac(int x) 
{ 
    char *str=malloc(sizeof(char)*(x+1)); 
    for(int i=0;i<x;i++) 
    {    
     str[i]='a'; 
    } 
    str[x]='\0'; 
    return str; 
} 
+1

或'memset(str,x,'a')'then null terminate :) –

0

正如@克里斯·特納所提到的,你應該終止與\0

您的字符串或者你也可以將其設置爲零點使用calloc分配內存,而不是malloc,爲calloc回報內存

1

您試圖將字符數組作爲字符串(由零字符終止的字符序列)輸出,而數組不包含字符串。

要麼輸出固定數量的字符數組元素。或者你應該在字符數組中存儲一個字符串。

例如

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

char *maxCharac(int x) 
{ 
    char *str=(char*)malloc(sizeof(char)*x); 
    for(int i=0;i<x;i++) 
    {    
     str[i]='a'; 
    } 

    return str; 
} 

int main(void) 
{ 
    const int N = 10; 

    for (int i = 1; i < N; i++) 
    { 
     char *s = maxCharac(i); 
     printf("%*.*s\n", i, i, s); 

     free(s); 
    }  

    return 0; 
} 

程序輸出是

a 
aa 
aaa 
aaaa 
aaaaa 
aaaaaa 
aaaaaaa 
aaaaaaaa 
aaaaaaaaa 

或者

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

char *maxCharac(int x) 
{ 
    char *str=(char*)malloc(sizeof(char)*x + 1); 
    int i = 0; 
    for (; i < x; i++) 
    {    
     str[i]='a'; 
    } 

    str[i] = '\0'; 

    return str; 
} 

int main(void) 
{ 
    const int N = 10; 

    for (int i = 1; i < N; i++) 
    { 
     char *s = maxCharac(i); 
     printf("%s\n", s); 

     free(s); 
    }  

    return 0; 
} 

程序輸出是

a 
aa 
aaa 
aaaa 
aaaaa 
aaaaaa 
aaaaaaa 
aaaaaaaa 
aaaaaaaaa