使用Pointer的字符串复制给出了问题

时间:2017-12-21 10:33:49

标签: c

这里有两个图表。计划1和计划2。

输入两个程序:{(0,0),(25,25)}

输出为:(0,0),(25,25)

程序-1工作正常,按预期发出put。程序2没有按预期的方式发出put没有错误。 在程序-2中*str2 = *token怀疑问题。但是问题没有确切地确定。任何人都可以解释我

计划--1

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>

char*  fun_call(char [], int );

int main()
{
    char str[] = "{(0,0),(25,25)}";
    int base_str_leng;
    char *retun_ptr;
    base_str_leng = sizeof(str)-1;
    printf("base_str_lemg:%d\n",base_str_leng);
    retun_ptr =  fun_call(str, base_str_leng);
    printf("str2 in main loop:::%s\n",retun_ptr);
    return 0;
}

char* fun_call(char str1[], int len)
{
    printf("len::%d\n", len);
    len = len-2;
    printf("len=%d\n",len);
    char *token = str1;

    char *str2 = (char*) malloc( len * sizeof(char) );
    printf("sizeof(str2) = %zd\n",malloc_usable_size(str2));

    printf("token:%s\n", token);       
    printf("****While loop started****\n");
    int i=0,j=0;
    while(token[i] != '\0')
    {
          if(token[i] != '{' && token[i] != '}' )
          {
              printf("Each token:%c\n", token[i]);
              str2[j] = token[i]; 
              i++;
              j++;
              printf("str2_Token::%c\n", str2[j]);
          }
          else
          {
              i++;
          }

        }
        printf("Function str2::%s\n", str2);
        return (str2);
}

计划:2

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>

char*  fun_call(char [], int );

int main()
{
    char str[] = "{(0,0),(25,25)}";
    int base_str_leng;
    char *retun_ptr;
    base_str_leng = sizeof(str)-1;
    printf("base_str_lemg:%d\n",base_str_leng);
    retun_ptr =  fun_call(str, base_str_leng);
    printf("str2 in main loop:::%s\n",retun_ptr);
    return 0;
}

char* fun_call(char str1[], int len)
{
    printf("len::%d\n", len);
    len = len-2;
    printf("len=%d\n",len);
    char *token = str1;

    char *str2 = (char*) malloc( len * sizeof(char) );
    printf("sizeof(str2) = %zd\n",malloc_usable_size(str2));

    printf("token:%s\n", token);       
    printf("****While loop started****\n");
     while(*token != '\0')
     {
          if(*token != '{' && *token != '}' )
          {
              // printf("Each token:%c\n", token[i]);
              *str2 = *token; 
              str2++;
              token++;
              // printf("str2_Token::%c\n",*str2);
          }
          else
          {
              token++;
          }
        }
        printf("Function str2::%s\n", str2);
        return (str2);
}

1 个答案:

答案 0 :(得分:0)

在你的程序2中,你没有用\ 0结束字符串,你的while循环在token[i] == '\0'

时结束

您可以使用calloc来将内存初始化为0

char *str2 = calloc( len, sizeof(char) );