如何使用标头 <string.h> 中的 strcat() 来连接两个指针指向的字符串?

Posted

技术标签:

【中文标题】如何使用标头 <string.h> 中的 strcat() 来连接两个指针指向的字符串?【英文标题】:How do you use strcat() from the header <string.h> to concatenate two pointer-pointed strings? 【发布时间】:2018-11-08 04:26:58 【问题描述】:

我正在尝试连接两个字符串以用作 fopen() 的路径。我有以下代码:

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

void main() 
    char *inputchar = (char*)malloc(sizeof(char)), *absolutepath = (char*)malloc(sizeof(char));
    FILE *filepointer;

    gets(inputchar); //Name of the file that the user wants
    absolutepath = "D:\\Files\\";
    strcat(*inputchar, *absolutepath); //Error occurs here
    filepointer = fopen(*inputchar, "r"); //Do I need to use the deference operator?
    fclose(filepointer);
    free(inputchar);
    free(absolutepath);

在 strcat() 处发生错误。那里发生了什么?

我必须在 fopen() 中对 inputchar 使用尊重运算符是否正确?

【问题讨论】:

有人可以回答我的问题吗? 【参考方案1】:

这里有 3 件事需要解决:

    您为 inputchar 分配了恰好 1 个字符的空间。因此,获取长度超过 0 个字符的字符串会弄乱程序的内存。为什么长于 0 个字符?因为gets在字符串的末尾写了一个终止的0字符。所以分配更多的东西,例如

    char *inputchar = (char*)malloc(256*sizeof(char));
    

    absolutepath = "D:\\Files\\"; "D:\\files\\" 是一个字符串文字,其值由编译器确定。因此,您不需要使用 malloc 为该字符串分配空间。你可以说:

    char *absolutepath = "D:\\Files\\";
    

    当调用 strcat 时,你给它的是指针值,而不是字符串的第一个字符。所以你应该这样做

    strcat(inputchar, absolutepath);
    

    而不是

    strcat(*inputchar, *absolutepath);
    

我建议阅读一些初学者 C 资源,例如这个http://www.learn-c.org/en/Strings 可能对你有好处。

【讨论】:

感谢您的回答!我读过:learn-c.org/en/Pointers、learn-c.org/en/Dynamic_allocation 和 learn-c.org/en/Strings。不过,我还有一些问题。我们通常使用 (char*)malloc(strlen(userinput)*sizeof(char)) 而不是像 256 这样的固定数字,对吧?根据您的回答和从链接中读取的一些内容,我假设我们不在 *absolutepath 上使用 malloc ,因为字符串文字告诉编译器计算字符串的大小并为字符串文字分配那么多内存,我明白了吗对吗?...................... ......................如果我创建了一个变量“yourname[]”,我可以scanf("% s”,你的名字)?或者我是否必须明确说明您的姓名的数组大小,例如yourname[10],扫描用户输入?对于您的第一点,我尝试使用 char* 的声明和 malloc 为用户的输入分配的内存不足,但是为什么我的程序可以工作?当我为指针变量分配的内存比需要的少时,什么时候会发生错误? 关于分配固定大小与完全正确的大小:是的,当您事先知道正确的大小时,您应该更喜欢正确的大小,但是当您阅读用户输入时,您不知道有多少将是。因此,您应该先验地选择最大长度,并且可能使用 scanf("%256s", string); 代替 gets() 。它允许您设置 scanf 将返回的最大长度。当你走到这一步时,你也可以在堆栈上而不是从堆上分配字符串,因为无论如何你都必须决定它的大小。 Malloc 从堆中分配内存,您必须手动释放该内存。字符串文字是程序代码的一部分,它始终存在,因此您无需手动分配或释放它。 我明白了。所以在大多数情况下,除非数据太大,否则您可以在堆栈上分配内存? (我也读过这个:***.com/questions/18217525/…)谢谢你的评论,我第二条评论忘了提到你,请你看一下:-)?

以上是关于如何使用标头 <string.h> 中的 strcat() 来连接两个指针指向的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

标准标头/库中是不是包含保护?

如何理解 gprof 输出?

C++中,<cstring>、<string.h>和<string>的关系,①这几个各在啥时候使用?需不需要命名空间?

C++中如何把char*转换成string*?

如何使用循环扫描字符串然后将这些字存储在数组中?

如何在tomcat 8中添加content-Type标头