c - 使用指针进行字符串复制会出现问题

标签 c

这里有两个程序。方案1和方案2。

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

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

程序-1工作正常,按预期输出。程序 2 没有按预期给出机器人没有错误。 怀疑程序-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);
}

最佳答案

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

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

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

关于c - 使用指针进行字符串复制会出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47922997/

相关文章:

c - 体系结构 x86_64 的 undefined symbol 在 C 中意味着什么?

c - 如何从未知输入类型(文件流或标准输入)读取数据 C

c - 如何从 C 文件中读取最后 n 行

java - 未找到 native 的实现

c - 这是一个有效的 C 程序吗?

c - 判断第一棵树是否是第二棵树的子集

c - c中类似宏的函数

c - 在 unsigned char[] 的情况下,空终止符不会添加到初始化程序的末尾!

c - For循环超出限制继续执行(C语言)

c - 为什么下面的程序输出 -80?