我正在尝试创建一个由随机生成的字符组成的随机生成的矩阵; 如果有人可以高亮显示我的代码中的错误,我将无法理解。...可能有很多,因为这是我第一次使用这种代码。
我的意思是,它可以编译,但是会打印'-'系列,但是创建的字符应该是字母。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE_STRING 20
int main() {
int number_arr_rows= 5;
int i , j;
int min_size_string= 4;
float probability;
int *arr_string_lenght = (int*)malloc(number_arr_rows*sizeof(int));
for(i = 0 ; i < number_arr_rows ; i++){
arr_string_lenght[i]= min_size_string + rand() % ( MAX_SIZE_STRING - min_size_string + 1);
}
char **created_string_arr = (char**)malloc(number_arr_rows * sizeof(*created_string_arr));
for( i = 0 ; i < number_arr_rows ; i++){
created_string_arr[i] = (char*)malloc(arr_string_lenght[i]*sizeof(created_string_arr));
}
// generating characters [A-Z][a-z] randomly. 50% probability.
for(i= 0 ; i < number_arr_rows ; i++){
for(j = 0 ; j < arr_string_lenght[j] ; j++){
probability = (float)((rand() % 101) / 100);
if(probability <= 0.5){
created_string_arr[i][j]= (char)(65 + rand() %26);
}
else{
created_string_arr[i][j] = (char)(97 +rand() %26);
}
}
}
for(i = 0 ; i < number_arr_rows ; i++){
for( j = 0 ; j < arr_string_lenght[i] ; j++){
printf("%s\n" , created_string_arr[i]);
}
}
return 0;
}
答案 0 :(得分:2)
第一个明显的问题是在这些行中:
for(i= 0 ; i < number_arr_rows ; i++){
for(j = 0 ; j < arr_string_lenght[j] ; j++){
您正在使用j
来索引arr_string_lenght
循环内的j
...应该是i
其次,您不会NUL
终止字符串,所以您不能这样做:
printf("%s\n" , created_string_arr[i]);
您也不需要这样做,因为无论如何都要遍历每个元素,这还解决了您没有分配足够的内存来存储NUL
的问题。您可以像这样打印每个字符:
for(i = 0 ; i < number_arr_rows ; i++) {
for( j = 0 ; j < arr_string_lenght[i] ; j++) {
printf("%c" , created_string_arr[i][j]);
}
printf("\n");
}
您也不必free
分配的内存。即使在这样的简单程序中也要这样做,以牢固地养成大型项目的习惯,这是一个好习惯。
答案 1 :(得分:0)
除了克里斯的回答:
您每次都会生成相同的值,因为您没有为随机生成器添加种子。
time_t t;
srand((unsigned) time(&t));
在rand()
的所有用法之前。
另外,您将(几乎)始终生成大写值,因为表达式
probability = (float)((rand() % 101) / 100);
几乎每次都会求值为0。相反,您应该使用:
probability = ((float)(rand() % 101)) / 100.0;