C 如何通过指向另一个指针的指针更改填充此字符串,该指针随后指向此字符串
我不确定该怎么做。下面是我的代码。函数readLine从文件中读取该行,并通过ptr2以字符串形式存储该行。我有一种感觉,我把星星弄乱了。有人能给我解释一下什么是正确的方法吗C 如何通过指向另一个指针的指针更改填充此字符串,该指针随后指向此字符串,c,pointers,C,Pointers,我不确定该怎么做。下面是我的代码。函数readLine从文件中读取该行,并通过ptr2以字符串形式存储该行。我有一种感觉,我把星星弄乱了。有人能给我解释一下什么是正确的方法吗 int main(int argc, char **argv) { FILE *fp; fp = fopen("testFile.txt","r"); if( fp == NULL ){ printf("Error while opening the file.\n"); }
int main(int argc, char **argv)
{
FILE *fp;
fp = fopen("testFile.txt","r");
if( fp == NULL ){
printf("Error while opening the file.\n");
}
char string[75];
char *ptr1 = &string[0]; //want ptr1 to point to string
char *ptr2 = &ptr1[0]; //want ptr2 to point to ptr1
readLine(fp,**ptr2); //want to send ptr2 pointer so that function read the file and add it to string can be edited through the pointer.
printf("%s", **string);
fclose(fp);
return 0;
}
readLine(FILE *fp, char **string){
fgets(**string, 75, fp);
}
编辑:我知道有更好的方法。我这样做只是为了帮助解释我试图理解的情况,即如何传递指向函数的指针来编辑字符串。当您声明:
char string[80];
string
是指向字符数组中第一个元素的指针
也就是说,我不理解ptr1
和ptr2
的角色。如果要读入字符串,可以简单地使用fscanf
char string[80];
FILE * pFile;
pFile = fopen ("myfile.txt","r");
fscanf (pFile, "%s", string);
当然,您需要检查fopen
和fscanf
的返回值。关于C函数readline
,它存在于两个位置libreadline
和libedit
。如果您正在实现自己的readLine
,它也可能有问题
附录:如果要修改函数中的字符串,请说readLine
void readLine(char **arr){
*arr = "efgh";
}
int main(int argc, const char** argv){
char *str = "abcd";
printf("%s\n",str);
readLine(&str);
printf("%s\n",str);
return 0;
}
这将通过指针
str
(readLine(&str)
)的地址,指针本身在函数中被更改(*arr=“efgh”
)。如果您有char*p1=&string[0]
,则只需将p1
的值分配给p2
:char*p2=p1
我想星号把你弄糊涂了。如果在变量声明中有一个星号,如:char*p2
,这意味着变量p2
是一个指针,但是当在另一个地方有星号时,例如*p2='c'
,则您取消引用该指针,即,将'c'
的值直接保存到p2
指向的内存位置
这是你的代码,修正了:
int main(int argc, char **argv)
{
FILE *fp;
fp = fopen("testFile.txt","r");
if( fp == NULL ){
printf("Error while opening the file.\n");
}
char string[75];
char *ptr1 = string;
char *ptr2 = ptr1;
readLine(fp, ptr2);
printf("%s", **pbuff); // I don't know what pbuff is
fclose(fp);
return 0;
}
readLine(FILE *fp, char *string){
fgets(string, 75, fp);
}
请记住,我之所以没有编译这篇文章,是因为我现在不能使用我姐姐的计算机,而她不是程序员。:) 您遇到的困难和问题似乎源于您对指针的不熟悉,以及它们如何作为参数传递给函数。当您声明一个字符数组时,例如
charstring[75]代码>字符串持有的值是静态声明的75字符数组的第一个字符(或起始内存地址)的地址。(它本身就是一个指针)
然后,当您声明指向数组的另一个指针时,只需将string
(指向string[0]
地址的指针)所持有的值分配给创建的任何新指针。e、 g:
char *ptr1 = string;
char *ptr2 = ptr1;
这与声明两个指针,然后将它们设置为字符串完全相同,例如:
char *ptr1, *ptr2;
ptr1 = ptr2 = string;
在处理指针时,它们只不过是一个变量,将指向其他对象的地址作为其值。因此,在上述ptr1
赋值之后,ptr2
和string
都具有相同的值(即75字符数组中第一个字符的地址)
现在,当您将指针作为参数传递给函数时,函数将接收指针的副本,就像函数接收任何其他变量的副本一样。这很重要。如果指针已经声明和分配(静态或动态),只需传递指针的副本,函数仍将接收其值(数组地址)。在这种情况下,不需要传递指针的地址,(例如,char**
)传递指针本身(即使作为副本传递),其值仍然提供所需的数组地址
唯一需要传递指针地址的情况是指针未分配(即NULL
-无地址),或者指针地址本身很重要(即传递指向链接列表的指针,在链接列表中更改列表中的第一个节点等),然后,为了使调用函数保持对新创建的指针或列表的新地址的正确引用(如果删除/添加新的第一个节点),必须将指针的地址传递给函数。在您的情况下,这不是必需的
事实上,在您的情况下,传递给readLine
(ptr1
、ptr2
、或string
)的是哪个值并不重要,因为它们都具有完全相同的值—分配数组的起始地址。您可以使用其中任何一个读取值,因为您读取的字符都将存储在完全相同的地址开始
考虑到这一点,您可以执行以下类似操作:
#include <stdio.h>
char *readLine (FILE *fp, char *string);
int main (int argc, char **argv) {
char string[75] = {0};
FILE *fp = NULL;
char *fn = argc > 1 ? argv[1] : "testFile.txt"; /* filename */
char *ptr1, *ptr2;
ptr1 = ptr2 = string;
if (!(fp = fopen (fn, "r"))) { /* validate file open */
fprintf (stderr, "error: file open failed '%s'.\n", fn);
return 1;
}
if (readLine (fp, ptr2))
printf ("%s\n", ptr1); /* any reference to string will work */
else
fprintf (stderr, "error: readLine failure.\n");
fclose(fp);
return 0;
}
char *readLine (FILE *fp, char *string)
{
return fgets (string, 75, fp);
}
使用/输出
$ ./bin/readln ../dat/captnjack.txt
This is a tale
他们没有角色。我只是用它们作为例子来帮助解释我想找出的东西。我想知道,在我的情况下,如何将ptr2作为参数发送到函数中,以便可以编辑S字符串的值。请您向我解释一下,为什么在函数头(**arr)中使用双星?但是当你编辑字符串时,你只需要使用*arr=“efgh”。@Quentin:c中的数组是指向数组中第一个元素的指针。@user3886450不,不是。检查数组和指针的sizeof
或&
地址,您会发现它们确实非常不同。@user3886450这不一样。试试这个:chars[80];char*p;s=p代码>没有特殊原因,只是忘了编辑它。:)我现在就纠正我的错误。:)
$ ./bin/readln ../dat/captnjack.txt
This is a tale