大佬教程收集整理的这篇文章主要介绍了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 中,我们鼓励使用指针从函数中获取值,而不是从函数中返回字符串。然而,主函数中的打印给出了随机输出
我相信您在这里使用指针的方式有些混乱。让我澄清一下。
在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,请注明来意。