Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何通过指向另一个指针的指针更改填充此字符串,该指针随后指向此字符串_C_Pointers - Fatal编程技术网

C 如何通过指向另一个指针的指针更改填充此字符串,该指针随后指向此字符串

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"); }

我不确定该怎么做。下面是我的代码。函数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");
    }

    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