使用malloc创建一个字符串,其中包含c语言中另一个字符串的元素



用C语言创建一个函数,接受一个字符串作为参数,并将其复制到一个新字符串中。如果原始字符串是"abc",那么新字符串应该是"aabbcc",如果原始字符串是"4",那么新字符串应该是44等等。我相信我理解解决这样一个问题所需的概念,但我就是不能在控制台中打印新的字符串。下面是我的函数:

void eco(char * str)
{
    int count = 0; 
    /*Counts the number of symbols in the string*/
    while(*(str + count) != '')
    {
       count++;              
    }
    /*Memory for the new string, wich should be 6 chars long ("aabbcc").*/
    char * newstr = malloc(sizeof(char *) * (count * 2)); 
    /*Creating the content for newstr.*/
    while(count > 0)
    {
       *newstr = *str;  //newstr[0] = 'a'
       *newstr++;       //next newstr pos
       *newstr = *str;  //newstr[1] = 'a'
       *str++;          //next strpos
       count--;         
    }
    /*I can't understand why this would not print aabbcc*/
    printf("%s", newstr);
    /*free newstr from memory*/
    free(newstr);
}

我已经尝试在创建newstr内容的while循环中单独打印每个字符,并且工作。但是当我尝试使用"%s"标志时,我要么得到奇怪的非键盘符号,要么什么都没有。

我不明白为什么不打印"aabbcc"

它不会这样做有两个原因:

  • 你没有传递指向开头字符串的指针,
  • 因为您没有添加空终止符

要解决第一个问题,在执行增量操作之前,将指向分配给newstr的块的指针存储在临时存储中。

为了解决第二个问题,在循环后增加*newstr = '',并调整malloc调用以增加终止符的char

// Do not multiply by sizeof(char), because the standard requires it to be 1
// You used sizeof(char*), which is wrong too.
char * newstr = malloc((count * 2) + 1);
char *res = newstr; // Store the original pointer
// Your implementation of the actual algorithm looks right
while (...) {
    ... // Do the loop
}
*newstr = '';
printf("%sn", res); // Pass the original pointer

你的循环推进newstr,所以在它完成后,它不再指向字符串的开始。您需要保存原来的指针,以便打印时使用。

作为起始

char * newstr = malloc(sizeof(char *) * (count * 2)); 
应该

char * newstr = malloc(1 + (count * 2));

包含空字符

然后你忘了加

同时newstr指向新字符串

的末尾

相关内容

  • 没有找到相关文章

最新更新