程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C - 无法在函数中复制字符串大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决C - 无法在函数中复制字符串?

开发过程中遇到C - 无法在函数中复制字符串的问题如何解决?下面主要结合日常开发的经验,给出你关于C - 无法在函数中复制字符串的解决方法建议,希望对你解决C - 无法在函数中复制字符串有所启发或帮助;

这个函数是根据\n对字符串进行拆分,看行号是否被选中。如果行号匹配,这个字符串应该被其他函数复制和使用:

voID SELEctDeparment(char* departments,int SELEctednum,char* SELEctedDepartment){

    char* copyOfDepartments = malloc(strlen(departments)+1);
    strcpy(copyOfDepartments,departments);

    char* sav1 = NulL;
    char* token = strtok_s(copyOfDepartments,"\n",&sav1);
    int counter = 0; 

    while(token != NulL){

        if(counter == SELEctednum){

             SELEctedDepartment =  malloc(strlen(token)+1);

             strcpy(SELEctedDepartment,token);

        }
        
        ++counter;

        token = strtok_s(NulL,&sav1);

    }

}

这个函数在 main 中调用如下:

char* SELEctedDepartment;

SELEctDeparment(recordsPtr[0],1,SELEctedDepartment);

printf(SELEctedDepartment);

recordsPtr[0] 包含四个以 \n 结尾的字符串:

aDeparment
anotherDepartment
newDepartment
otherDepartment

在 C 中,我们鼓励使用指针从函数中获取值,而不是从函数中返回字符串。然而,主函数中的打印给出了随机输出

C - 无法在函数中复制字符串

解决方法

我相信您在这里使用指针的方式有些混乱。让我澄清一下。

在main函数中,字符指针SELEctedDepartment在计算机中持有一定的内存。但是当对 void SELEctDeparment(char* departments,int SELEctedNum,char* SELEctedDepartment) 进行函数调用时,会创建 SELEctedDepartment 的新副本。此后对 SELEctedDepartment 所做的任何更改仅在被调用函数的范围内完成,不会影响主函数中的原始指针。

因此,解决此问题的一种明确方法是将指针传递给 main 函数中定义的字符指针。这将给出正确/预期的结果。

这里是函数的修改版 -

    void SELEctDeparment(char* departments,char** SELEctedDepartment){

    char* copyOfDepartments = malloc(strlen(departments)+1);
    strcpy(copyOfDepartments,departments);
    
    char* sav1 = NULL;
    char* token = strtok_s(copyOfDepartments,"\n",&sav1);
    int counter = 0; 

    while(token != NULL){

        if(counter == SELEctedNum){

             (*SELEctedDepartment) =  malloc(strlen(token)+1);
             strcpy(*SELEctedDepartment,token);

        }
        
        ++counter;

        token = strtok_s(NULL,&sav1);

    }
}
    

这就是从主函数中调用它的方式-

    int main() {

    char* recordsPtr[] = {"aDeparment\nanotherDepartment\nnewDepartment\notherDepartment"};

    char* SELEctedDepartment;

    SELEctDeparment(recordsPtr[0],1,&SELEctedDepartment);
    printf(SELEctedDepartment);
}
,

我认为您对“指向什么的指针?”感到困惑,您应该返回。在您的 SELEctDeparment() 函数中,如果我了解需要什么,您是否只需要返回一个指向 recordsPTR 中正确部门的指针。你不需要分配或标记来做到这一点。您已经拥有该部门的索引。因此,只需将返回类型更改为 char * 并返departments[SELEctedNum];

例如,您可以将示例缩减为:

#include <stdio.h>

char *SELEctDeparment (char **departments,int SELEctedNum){

    return departments[SELEctedNum];
}

int main (void) {
    
    char *SELEctedDepartment = NULL;
    char *recordsPTR[] = { "aDepartment\n","anotherDepartment\n","newDepartment\n","otherDepartment\n" };
    
    SELEctedDepartment = SELEctDeparment (recordsPTR,1);
    
    fputs (SELEctedDepartment,stdout);
}

注意: '*' 通常与变量名而不是类型一起使用。为什么?因为:

int* a,b,c;

当然不会声明指向 int 的三指针,

int *a,c;

明确表示您已经声明了一个指向 int 的单指针和两个整数。

示例使用/输出

运行上面的示例,您将:

$ ./bin/SELEctedDept
anotherDepartment

您需要添加数组边界保护以确保传递的索引不会尝试读取数组边界。这是留给你的

如果您必须使用 void

如果必须使用 void 类型的函数,则可以将 AddressOf 指针传递给函数,以便函数接收 {{1} 中指针的原始地址}.然后,您可以将正确的部门分配给原始指针地址,以便在 @H_277_3@main() 中可以看到更改。当您传递地址指针时,它将需要一个额外的间接级别,例如

@H_277_3@main()

(结果相同,添加数组边界保护的注释相同)

看看这个,让我知道我是否正确填写了缺失的部分。如果没有,请发表评论,我很乐意提供进一步帮助。

大佬总结

以上是大佬教程为你收集整理的C - 无法在函数中复制字符串全部内容,希望文章能够帮你解决C - 无法在函数中复制字符串所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-