【问题标题】:Function returning unexpected value函数返回意外值
【发布时间】:2017-08-15 15:46:11
【问题描述】:

我写了一个这样的函数,当参数x 甚至它不能按预期工作时,例如如果我在main 中输入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;   
}

【问题讨论】:

  • 不要忘记 0 终止你的字符串。这就是问题所在。重复链接,有人吗?
  • 阅读printf的要求。
  • printf("%.*s",2, maxCharac(2)) 将字符数组打印为可能缺少空字符的“字符串”。
  • 另外,一旦你完成分配的内存,不要忽视释放它。
  • 请提供有关您的函数所需行为的信息。对于这么简单的事情,并不难弄清楚,但总的来说它是重要的信息

标签: c arrays string output


【解决方案1】:

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;   
}

【讨论】:

  • memset(str,x,'a') 然后 null 终止 :)
【解决方案2】:

您正在尝试将字符数组输出为字符串(以零字符结尾的字符序列),而该数组不包含字符串。

您应该输出固定数量的字符数组元素。或者你应该在字符数组中存储一个字符串。

例如

#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

【讨论】:

    【解决方案3】:

    正如@Chris Turner 所说,您应该使用\0 终止您的字符串

    您也可以使用calloc 而不是malloc 来分配内存,因为calloc 通过将内存设置为零来返回内存

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多