c - 通过指针的字符串(数组)容量

标签 c arrays string pointers size

我正在尝试创建一个子例程,将一个字符串插入另一个字符串。我想检查主机字符串是否有足够的容量来容纳所有字符,如果没有,则返回错误整数。这需要使用类似 sizeof 的东西,但可以使用指针调用。我的代码如下,我将非常乐意提供任何帮助。

#include<stdio.h>
#include<conio.h>
//#include "string.h"

int string_into_string(char* host_string, char* guest_string, int insertion_point);

int main(void) {
    char string_one[21] = "Hello mother";    //12 characters
    char string_two[21] = "dearest ";        //8 characters
    int c;

    c = string_into_string(string_one, string_two, 6);
    printf("Sub-routine string_into_string returned %d and creates the string: %s\n", c, string_one);
    getch();
    return 0;
}

int string_into_string(char* host_string, char* guest_string, int insertion_point) {
    int i, starting_length_of_host_string;
    //check host_string is long enough
    if(strlen(host_string) + strlen(guest_string) >= sizeof(host_string) + 1) {
        //host_string is too short
        sprintf(host_string, "String too short(%d)!", sizeof(host_string));
        return -1;
    }

    starting_length_of_host_string = strlen(host_string);
    for(i = starting_length_of_host_string; i >= insertion_point; i--) {    //make room
         host_string[i + strlen(guest_string)] = host_string[i];
    }
    //i++;
    //host_string[i] = '\0';
    for(i = 1; i <= strlen(guest_string); i++) {    //insert
         host_string[i + insertion_point - 1] = guest_string[i - 1];
    }
    i = strlen(guest_string) + starting_length_of_host_string;
    host_string[i] = '\0';

    return strlen(host_string);
}

最佳答案

C 不允许将数组作为函数参数传递,因此所有 T[N] 类型的数组都会衰减为 T* 类型的指针。您必须手动传递尺寸信息。但是,您可以在调用站点使用 sizeof 来确定数组的大小:

int string_into_string(char * dst, size_t dstlen, char const * src, size_t srclen, size_t offset, size_t len);

char string_one[21] = "Hello mother";
char string_two[21] = "dearest ";

string_into_string(string_one, sizeof string_one,   // gives 21
                   string_two, strlen(string_two),  // gives 8
                   6, strlen(string_two));

如果您使用 malloc 创建动态数组,则无论如何都必须将大小信息单独存储在某处,因此这个习惯用法仍然适用。

(请注意 sizeof(T[N]) == N * sizeof(T),并且我已经使用了 sizeof(char) == 1 > 简化代码。)

关于c - 通过指针的字符串(数组)容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11930810/

相关文章:

c - 将输出重定向到文件时 printf() 和 system() 的结果顺序错误

php - 在表中显示 PHP 查询数组

c - 如何将 const 数组或变量数组传递给 C 中的函数?

ios - 将对象添加到数组时更新 textView 文本,而不覆盖前一个对象的 textView 文本

java - 将字符串转换为适当的数据类型

mysql - sql创建一个函数

python - 这条 Python 语句的含义是什么?

c - 奇怪的编译速度优化结果——IAR编译器

c - 在函数中直接使用结构是否比在 C 中将它们传递给参数使用更多的资源?

c - 我有一个二叉搜索树,我想将节点复制到一个数组中序(递归函数)