动态char数组C中的随机字符

时间:2018-01-12 03:08:52

标签: c arrays random chars

我需要char数组的帮助。我想创建一个n-lenght数组并初始化它的值,但是在malloc()函数之后,数组比n * sizeof(char)长,并且数组的内容不仅仅是我分配的字符...在数组中很少随机的字符,我不知道如何解决这个问题...我需要在学校考试的一个项目的代码部分,我必须在周日结束...请帮助:P

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

int main(){

    char *text;

    int n = 10;

    int i;

    if((text = (char*) malloc((n)*sizeof(char))) == NULL){
        fprintf(stderr, "allocation error");
    }

    for(i = 0; i < n; i++){
        //text[i] = 'A';
        strcat(text,"A");
    }

    int test = strlen(text);
    printf("\n%d\n", test);

    puts(text);
    free(text);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

在使用strcat make

之前
text[0]=0;

strcat期望第一个参数的空终止char数组。

来自standard 7.24.3.1

  #include <string.h>
          char *strcat(char * restrict s1,
               const char * restrict s2);
  

strcat函数附加s2指向的字符串的副本   (包括终止空字符)到字符串的结尾   s1指出。 s2的初始字符会覆盖null   s1末尾的字符。

如果不这样做,您认为strcat将如何知道第一个字符串的结束位置 将\0放入s1

另外,不要忘记为\0字符分配额外的字节。否则你正在写你已分配的内容。这又是未定义的行为。

早些时候你有未定义的行为。

注意:

  • 您应该检查malloc的返回值,以了解malloc调用是否成功。

  • 不需要转换malloc的返回值。在这种情况下,隐式地完成从void*到相关指针的转换。

  • strlen返回size_t而不是intprintf("%zu",strlen(text))

答案 1 :(得分:0)

首先,您可以在

中使用malloc
text = (char*) malloc((n)*sizeof(char)

不理想。您可以将其更改为

text = malloc(n * sizeof *text); // Don't cast and using *text is straighforward and easy. 

所以陈述可能是

if(NULL == (text = (char*) malloc((n)*sizeof(char))){
    fprintf(stderr, "allocation error");
}

但实际问题在于

for(i = 0; i < n; i++){
    //text[i] = 'A';
    strcat(text,"A");
}

strcat文档说

  

dest - 这是指向目标数组的指针,该数组应该包含   一个C字符串,应该足够大以包含连接   结果字符串。

只是要指出上面的方法存在缺陷,你只需要考虑C字符串"A"实际上包含两个字符, A 和终止 \ 0 (空字符)。在这种情况下,当in-2时,您具有超出范围的访问权限或缓冲区溢出 1 。如果您想用 A 填充整个text数组,那么您可以完成

for(i = 0; i < n; i++){ 
    // Note for n length, you can store n-1 chars plus terminating null
    text[i]=(n-2)==i?'A':'\0'; // n-2 because, the count starts from zero
}
//Then print the null terminated string
printf("Filled string : %s\n",text); // You're all good :-)

注意:使用 valgrind 之类的工具查找内存泄漏情况&amp;超出内存访问。