用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
指向新字符串