Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中将字符数组中的字符串添加到字符串_C_Arrays_String - Fatal编程技术网

如何在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没有字符串类型。从您的问题来看,您迫切需要先学习基本知识,即指针、数组等。
    *
    没有