C将字符逐个附加到char数组中

时间:2018-03-14 16:50:01

标签: c arrays string

我已经编写了一个返回一些字符的函数,我想要做的就是将所有返回的字符追加到一个字符串中。

#include <stdio.h>
#include <string.h>

char func(int n);
int main()
{
    int i;
    char str[] = "";
    size_t p = strlen(str);

    for (i =0 ; i < 5; i++){
        str[p++] = func(i);
        str[p] = '\0';
        p++;
    }

    printf("%s",str);
    return 0;
}


char func(int n){
    if (n == 0)
      return '1';
    if (n == 1)
      return '2';
    if (n > 1)
      return '3';

}

// EDIT输出为19

3 个答案:

答案 0 :(得分:3)

char func(n){
    if (n == 0)
      return '1';
    if (n == 1)
      return '2';
    if (n > 1)
      return '3';
}

您应该始终指定变量的类型。

请使用int n之类的内容,而不只是n

所有的回报都是有条件的,这也很糟糕,最好有一个保证执行的返回语句,无论什么*:

char func(int n) {
    if (n == 0) return '1';
    if (n == 1) return '2';

    return '3';
}

*因为没有从应该返回值的函数返回值是未定义的行为。

现在我们已经解决了这个问题,让我们来看看你的main()

int main() {
    int i;
    char str[] = "";
    size_t p = strlen(str);

    for (i =0 ; i < 5; i++){
        str[p++] = func(i);
        str[p] = '\0';
        p++;
    }

    printf("%s",str);
    return 0;
}
  • str[]不足以存储您写入的所有字符,从而导致未定义的行为。

  • 您的循环体以奇怪的方式编写,为什么要递增p两次?

这是一个非常简单的程序,它将5个字符写入str

#include <stdio.h>

char func(int n) {
    if (n == 0) return '1';
    if (n == 1) return '2';

    return '3';
}

int main() {
    int i;
    // Allocate 6 bytes (5 characters) on the stack
    char str[6] = "";

    for (i = 0 ; i < 5; i++) {
        str[i] = func(i);
    }

    // Strings *must* be NULL terminated in C
    str[5] = 0;

    printf("%s",str);

    return 0;
}

答案 1 :(得分:1)

这里你的str的大小是“0”(0使用strlen,1使用sizeof运算符,因为它计算'\ 0'字符)所以你不能添加更多的元素到str,如果你尝试,程序会崩溃。所以你在这里有两个可能性,第一个是声明一个固定的表大小,数字n将受到大小的限制,第二个是使用mallic的动态数据。要将其初始化为零,您只需使用memset API。

答案 2 :(得分:1)

简短的回答是你所做的一切都是正确的,如果你有足够的内存来容纳那些5字符和\0,如果你想把它当作一个字符串(NUL终止{ {1}}数组)。

char是一个只包含""的字符串文字。该字符串的长度为\0。阵列怎么样?将0应用于它会显示它能够容纳一个字符。 (它包含sizeof)。

现在使用您的代码,您确实可以访问超出数组大小的位置。这是未定义的行为 - 由C标准提及。

解决方案是要么有一个数组,其大小能够保存有一天你想要存储的最大字符。或者您可以使用\0,通过使用char*malloc等函数为其分配已分配块的地址。有益于此,您可以根据需要增加内存运行时取决于您要存储的字符数。