Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
当我用char指针复制字符串时返回null_C - Fatal编程技术网

当我用char指针复制字符串时返回null

当我用char指针复制字符串时返回null,c,C,我试着用字符指针复制字符串,但程序什么也没给我,我也不知道 请让我知道我的代码的问题 int main() { char *a = "helloworld.txt"; char *b = malloc( sizeof(char) * 20 ); while(*a!='\0') { *b++=*a++; } *b = '.'; b++; *b = '\0'; printf("string: %s\n", b); }

我试着用字符指针复制字符串,但程序什么也没给我,我也不知道

请让我知道我的代码的问题

int main() {
    char *a = "helloworld.txt";
    char *b = malloc( sizeof(char) * 20 );

    while(*a!='\0') {
        *b++=*a++;
    }
    *b = '.';
    b++;
    *b = '\0';

    printf("string: %s\n", b);
}
结果是:

你需要这个:

int main() {
  char *a = "helloworld.txt";
  char *b = malloc( sizeof(char) * 20 );
  char *c = b;                  // save pointer to allocated memory

  while(*a!='\0') {
    *b++=*a++;
  }
  *b = '.';
  b++;
  *b = '\0';                    // b points to the end of the constructed 
                                // string now

  printf("string: %s\n", c);    // use pointer saved before instead of b
}
你需要这个:

int main() {
  char *a = "helloworld.txt";
  char *b = malloc( sizeof(char) * 20 );
  char *c = b;                  // save pointer to allocated memory

  while(*a!='\0') {
    *b++=*a++;
  }
  *b = '.';
  b++;
  *b = '\0';                    // b points to the end of the constructed 
                                // string now

  printf("string: %s\n", c);    // use pointer saved before instead of b
}

这是因为当你说printfstring:%s\n,b;您正试图打印从b开始的字符串,但*b='\0'。所以难怪是空字符串

将指针b保存到一个临时指针,我们将使用该临时指针打印字符串,因为指针b在while循环中不断增加,我们失去了字符串开始的跟踪。或

使用printfstring:%s\n,b-strena+1;正如@Barmar在评论中建议的那样

还有,您如何确定b在malloc之后指向有效的内存位置?此代码容易出错,并可能导致SegFault

始终通过比较指针与NULL来检查在malloc、calloc等之后是否分配了内存


这是因为当你说printfstring:%s\n,b;您正试图打印从b开始的字符串,但*b='\0'。所以难怪是空字符串

将指针b保存到一个临时指针,我们将使用该临时指针打印字符串,因为指针b在while循环中不断增加,我们失去了字符串开始的跟踪。或

使用printfstring:%s\n,b-strena+1;正如@Barmar在评论中建议的那样

还有,您如何确定b在malloc之后指向有效的内存位置?此代码容易出错,并可能导致SegFault

始终通过比较指针与NULL来检查在malloc、calloc等之后是否分配了内存


最初的问题是修改指向目标字符串的指针。b指向字符串终止符,因此下面的printf只会看到一个空字符串。使用临时指针指向增量

但这种递增还有其他更严重的程序稳定性问题:更改指向已分配对象的唯一指针。因此你不能再释放它了

通常,一旦不再需要分配的内存块,就应该释放它


还应始终检查函数报告的错误。malloc可能会失败,返回空指针。取消引用空指针是未定义的行为。你不想遇到它

最初的问题是修改指向目标字符串的指针。b指向字符串终止符,因此下面的printf只会看到一个空字符串。使用临时指针指向增量

void main(){

    char *str1;
    printf("\nEnter the string to be copied\n");
    scanf("%[^\n]s",&*str1);
    copystr(&str1);
    getch();
    clrscr();

}


copystr(char **str1){
    char **str2;
    int i=0;
    while(**str1!='\0'){
         // printf("address if str1 %u ",*str1);
        *str2=*str1;
           printf("\n%c",**str2);
        (*str1)++;
        (*str2)++;
        i++;
        printf(" address of str2 %u ",*str2);
    }
    *str2=(*str2)-i;
    //  printf("%d",i);
    printf("\n%s",*str2);
}
但这种递增还有其他更严重的程序稳定性问题:更改指向已分配对象的唯一指针。因此你不能再释放它了

通常,一旦不再需要分配的内存块,就应该释放它


还应始终检查函数报告的错误。malloc可能会失败,返回空指针。取消引用空指针是未定义的行为。你不想遇到它

*b='\0';打印字符串:%s\n,b;:b指向“\0”。您需要保留的字符串头的地址。@BLUEPIXY是,所以我尝试了printfstring:%s\n,&b[0],但它仍然给了我空字符串。在没有其他字符串指针帮助的情况下,我应该在哪里打印字符串?@devsy:&b[0]至少在b已经是指针的情况下完全等同于b,所以更改没有任何作用。@TimČas好的,那么打印b-15怎么样?哪个应该是helloworld.txt.b的起点@devsy将起作用,尽管它不是一个非常灵活的解决方案。有时候,你只是不知道要跳回多少地方。创建指向malloced内存开始的第二个指针是最简单的方法*b='\0';打印字符串:%s\n,b;:b指向“\0”。您需要保留的字符串头的地址。@BLUEPIXY是,所以我尝试了printfstring:%s\n,&b[0],但它仍然给了我空字符串。在没有其他字符串指针帮助的情况下,我应该在哪里打印字符串?@devsy:&b[0]至少在b已经是指针的情况下完全等同于b,所以更改没有任何作用。@TimČas好的,那么打印b-15怎么样?哪个应该是helloworld.txt.b的起点@devsy将起作用,尽管它不是一个非常灵活的解决方案。有时候,你只是不知道要跳回多少地方。创建指向malloced内存开头的第二个指针是最简单的方法,没有c的帮助就可以打印字符串b?@devsy当然b=&b[0]不起作用。b=&b[0]相当于b=b;。有没有办法不用c打印字符串b?不,没有办法。使用malloc分配内存后,b指向该内存。如果修改b afterwords,则会丢失该指针。@devsy print b-15在字符串的总长度为15时起作用,但如何确保长度为15?修改helloworld.txt字符串会破坏您的程序。您可以打印b-strena-1是否可以在没有c帮助的情况下打印字符串b?@devsy当然b=&b[0]不起作用。b=&b[0]相当于b=b;。有没有办法打印字符串
void main(){

    char *str1;
    printf("\nEnter the string to be copied\n");
    scanf("%[^\n]s",&*str1);
    copystr(&str1);
    getch();
    clrscr();

}


copystr(char **str1){
    char **str2;
    int i=0;
    while(**str1!='\0'){
         // printf("address if str1 %u ",*str1);
        *str2=*str1;
           printf("\n%c",**str2);
        (*str1)++;
        (*str2)++;
        i++;
        printf(" address of str2 %u ",*str2);
    }
    *str2=(*str2)-i;
    //  printf("%d",i);
    printf("\n%s",*str2);
}

b没有c的帮助?不,没有办法。使用malloc分配内存后,b指向该内存。如果修改b afterwords,则会丢失该指针。@devsy print b-15在字符串的总长度为15时起作用,但如何确保长度为15?修改helloworld.txt字符串会破坏您的程序。您可以打印b-strena-1感谢您的解释!:!!谢谢你的解释!:!!如果我使用b=b-15将指针b指向原始地址,我可以释放块吗?15是字符串“helloworld.txt.b”的块nums?它是否仍然知道分配的大小是20??,还是我应该让指针只指向最初分配的位置?@devsy:要说谢谢,请不要评论,而是使用向上投票按钮。是的,你必须使用完全相同的地址,你从malloc&friends免费获得。从你的问题中,我看出你缺乏一些基本的理解。在每一本好的C语言书或教程中,你都会找到答案和许多其他你最终会遇到的问题。现在只需记住,为你处理的每一个对象调用free一次。包括calloc和reallocNULL、大小或类似。指针是对象的指针,因此与从分配函数获得的值相同。还要检查错误!如果我使用b=b-15将指针b指向原始地址,我可以释放块吗?15是字符串“helloworld.txt.b”的块nums?它是否仍然知道分配的大小是20??,还是我应该让指针只指向最初分配的位置?@devsy:要说谢谢,请不要评论,而是使用向上投票按钮。是的,你必须使用完全相同的地址,你从malloc&friends免费获得。从你的问题中,我看出你缺乏一些基本的理解。在每一本好的C语言书或教程中,你都会找到答案和许多其他你最终会遇到的问题。现在只需记住,为你处理的每一个对象调用free一次。包括calloc和reallocNULL、大小或类似。指针是对象的指针,因此与从分配函数获得的值相同。还要检查错误!