如何在C中将字符数组中的字符串添加到字符串
我正在尝试创建一个程序,从片假名(日语音节)生成随机单词如何在C中将字符数组中的字符串添加到字符串,c,arrays,string,C,Arrays,String,我正在尝试创建一个程序,从片假名(日语音节)生成随机单词 #包括 #包括 #包括 #包括 #包括 #包括 #包括 字符*字; char*kata[]={”ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ", "ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","
#包括
#包括
#包括
#包括
#包括
#包括
#包括
字符*字;
char*kata[]={”ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ",
"ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ヲ","ン","ガ","ギ",
"グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ","ャ","ュ",
"ョ","ヴ","ァ","ィ","ゥ","ェ","ォ"};
int x=0;
无效生成器(整数长度){
对于(intz=0;z应添加大量检查(例如word上的溢出)
kata上的元素数是sizeof
kata/sizeof
一个可以执行宏countof
strcat
是您需要的功能
这个想法有点像
char *kata[] = {"ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ
",
"ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ヲ","ン","ガ","ギ",
"グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ","ャ","ュ",
"ョ","ヴ","ァ","ィ","ゥ","ェ","ォ"};
int x = 0;
static void generator (int nb, char *word, size_t n) {
word[0] = '\0';
while (nb-- > 0) {
x = rand() % (sizeof(kata) / sizeof(char*));
strcat(word, kata[x]);
}
}
int main (void) {
char word[64];
srand((unsigned) time(NULL));
int nb = rand() % 5 + 2;
generator(nb, word, sizeof(word));
puts(word);
return 0;
}
你在读哪本书?我问你的原因是你遇到了一系列关于C语言基本原理的绝对错误,而阅读好书的人通常不会遇到这些错误。我可以向那些已经有过其他语言编程经验的人推荐K&R2E
word是字符串
不在您向我们展示的代码中,不…word
包含一个空指针,并且在您的代码中您将分配到该空指针。坏消息:(
不要把字符串(一类值)的概念和指针(一类类型)混为一谈
字符串是以第一个'\0'
结尾的字符值序列。这是一个值。字符串存储在数组中;数组是类型的一个类别
指针表示一种类型,该类型的值指向/指向数组(可能包含或不包含字符串)、函数或零(为空指针)
是一个包含片假名的字符数组
同样,情况并非如此。kata
是char*
的数组char*
不是字符类型,而是字符指针类型
但是,如果我没有包含“*”使数组成为字符串数组,C会抱怨一个字符中有多个字符
我不确定您期望的是什么。因为字符串文本表达式的类型,例如“ア“
是一个char[n]
(字符数组类型),它被转换为char*
(字符指针类型),其值指向第一个字符,并且在数组中存储多个字符,数组的类型需要是char*[m]
。*
是必需的!我看这里没有问题
不过,我确实看到了其他问题。首先,concat
没有定义。您没有就此提出任何问题,因此我将使用以下定义来填补空白:
void concat(char *dest, char *src) {
strcat(dest, src); // `strcat` is from `<string.h>`
}
声明数组,并使用数组标识符,可能与+
加法运算符一起指向数组中的元素。例如:
int x;
int *pointer_to_x = &x;
int array[42];
int *pointer_to_first = array + 0;
int *pointer_to_second = array + 1;
int *pointer_to_whatever = malloc(42 * sizeof *pointer_to_whatever);
// Remember to free(pointer_to_whatever) ONCE when you're done with it
调用malloc
、realloc
、calloc
或其他返回指向适当大小对象的指针的函数。例如:
int x;
int *pointer_to_x = &x;
int array[42];
int *pointer_to_first = array + 0;
int *pointer_to_second = array + 1;
int *pointer_to_whatever = malloc(42 * sizeof *pointer_to_whatever);
// Remember to free(pointer_to_whatever) ONCE when you're done with it
int
实际上不适合存储数组索引或长度;最好使用size\u t
,因为它没有负值,这不仅消除了一些错误,还使代码更高效
rand()%sizeof(*kata)
不是很随机的
事实上,这是完全可以预测的。通过使用相同的种子重新播种,另一个程序可以复制精确的序列。通过在种子上迭代,从seed=time(NULL)开始
并且在时间上向后移动,很容易证明这与单个int
值一样具有可预测性,尽管它实际上是多个字符值
此外,rand
往往会引入偏差,特别是当您使用%
运算符来减少偏差时。您需要消除偏差。您可以通过首先将随机数分配给一个双精度
,然后将其除以rand_MAX+1.0
,如下所示:
double rand_double(void) {
return rand() / (RAND_MAX + 1.0);
}
通过此函数返回介于0.0
和1.0
之间的值(不包括1.0
),您应该能够使用rand_double()*(sizeof kata/sizeof*kata)例如,这将是更好的…但是偏向仍然存在;它只是减少了。为了消除偏倚,你需要考虑<代码> RAND 返回一系列的值,每个值都位于<代码> [0…RANDMAX ]中。
,并且您的范围没有平均划分为该范围;划分的剩余部分是您偏差的很大一部分。您需要获取范围,并将其截断为平均划分的部分!也就是说,创建一个包装rand
并丢弃大于rand\u MAX-(rand\u MAX%)的值的函数(sizeof kata/sizeof*kata))
…我已经描述(并解决)了这个问题,为了方便起见,下面是对该代码的修改:
unsigned int rand_range(unsigned int ceiling) {
int n;
do {
n = rand();
} while (RAND_MAX - n <= RAND_MAX % ceiling);
return n % ceiling;
}
无符号整数随机范围(无符号整数上限){
int n;
做{
n=兰德();
}而(RAND_MAX-n 1)concat
未定义。2)word
为NULL
.3)sizeof(*kata)
不是元素数。编译时添加警告和错误将允许您(和我们)为了节省大量时间,编译器可能不支持在源文件中使用非ascii字符。C没有字符串类型。从您的问题来看,您迫切需要先学习基本知识,即指针、数组等。*
没有