函数在c中返回一串零

时间:2017-07-07 09:54:57

标签: c

我试图创建一个函数,返回一个零数组我们一个char数组 并在文件文本中打印此数组,但是当我返回一个字符串时,返回了一个额外的字符

enter image description here

这是程序写的文本文件字符串

enter image description here

这是我的功能:

 char *zeros_maker (int kj,int kj1)
{
     char *zeros;
    zeros = (char *) malloc(sizeof(char)*(kj-kj1));
    int i;
    for(i =0;i<kj-kj1;i++)
        zeros[i]='0';
    printf("%s\n",zeros);
    return zeros;
}

我在文件中打印时使用的指令

fprintf(pFile,"%c%s%c &",34,zeros_maker(added_zeros,0),34);

提前致谢

4 个答案:

答案 0 :(得分:2)

C中的

let video = document.querySelector('video'); let close = document.querySelector('.close'); close.onclick = () => { video.pause(); } 是用于数字零的编码值。这不是允许使C标准值为0。

您需要在'0'数组的末尾添加NUL终结符'\0',以使char函数正常工作。

否则,您可能会遇到运行超出printf数组末尾的风险,结果不明确。

最后,不要忘记在程序的某个时刻char分配内存。

答案 1 :(得分:0)

Read about how string in C are meant to be terminated

每个字符串都以null char '\0'终止(NULL符号ASCII值为0,不要与具有ASCII值'0'的char 48混淆。 标识字符串的结尾

zeros[kj-kj1]='\0';

如果您正在访问一个超出范围的元素,请务必检查。在这种情况下,如果kj1> kj

,就会发生这种情况

答案 2 :(得分:0)

您可以获得memset

,而不是for循环
char* zeros_maker(int kj,int kj1)
{
    int len=kj-kj1;
    char *zeros=malloc(sizeof(char)*(len));
    memset(zeros,'0',len-1);
    zeros[len-1]=0;
    printf("%s\n",zeros);
    //fflush(stdout);
    return zeros;
}

或者,如果您不是C风格字符串的粉丝,并且它只是ASCII,也可以使用以下内容。小心你正在这样做。

char* zeros_maker_pascal_form(int kj,int kj1)
{
    int len=kj-kj1;
    char *zeros=malloc(sizeof(char)*(len));
    memset(zeros,'0',len);
    for(int a=0;a<len;a++){
      printf("%c",zeros[a]);
    }
    printf("\n");
    //fflush(stdout);
    return zeros;
}

答案 3 :(得分:0)

您的代码有一些基本问题,主要问题是它无法终止字符串(并包含终结符的空间)。

这是一个固定和清理的版本:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>Click to fade out character by character</button><br><br>

<div>
  <span id="A">A</span>
  <span id="B">B</span>
  <span id="C">C</span>
</div>

这比您的代码有以下改进:

  • 它简化了接口,只需要返回应该返回的零的数量(返回的字符串的长度)。在呼叫站点进行减法,这两个值是有意义的。
  • char * zeros_maker(size_t length) { char *s = malloc(length + 1); if(s != NULL) { memset(s, '0', length); s[length - 1] = '\0'; } return s; } 没有强制转换价值,malloc()也没有缩放,因为我认为这毫无意义。
  • 在使用内存之前,检查sizeof (char)返回的NULL
  • 使用malloc()将字节范围设置为单个值,这是一个标准的C函数,比自定义循环更容易知道和验证。
  • 当然,终止字符串。

这样称呼:

memset()

完成后,请记住char *zs = zeros_maker(kj - kj1); puts(s); free(s); 字符串。