我已经尝试了很多方法,但我无法让它发挥作用。我的设置说要使用char[],但我研究的所有内容都没有关于使用它的信息。这是我在下面的代码
#include <stdio.h>
#include <string.h>
char[] makeString(char character,int count)
{
char finalString[count];
strcpy(finalString,character);
for(int i=1;i<=count;i++)
{
strcat(finalString,character);
}
return finalString;
}
int main() {
printf("%sn",makeString("*",5)); }
我正在尝试创建一个函数,该函数多次返回给定字符计数的字符串。非常感谢您的帮助。
如果这是一个非常简单的错误,我很抱歉,我大部分代码都是用python编写的,所以C对我来说是非常新的
有几个问题,主要是关于char finalString[count];
-
finalString
是在函数中创建的变量,它被称为局部变量。它将在函数返回后被销毁。 -
作为CCD_ 4变量的值的CCD_。在编译阶段无法确定其值,因此编译器无法为此数组分配内存空间。编译将失败。
修复此问题。
-
或者在外部创建这个变量并将其传递到函数中。或者在
HEAP
空间上创建变量。由于Heap space
在整个程序中共享,因此不会受到函数结束的影响。 -
或者使用常数或者动态地分配具有
malloc
、calloc
等的存储器块。
这里有一个完整代码的演示:
// main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* makeString(char character,int count) {
char* finalString = malloc(count+1); //dynamic allocate a chunk of space. +1 for mimic string end with an extra termination sign 0.
for(int i=0; i<count; i++) {
finalString[i] = character;
}
finalString[count] = 0; // string end signal 0
return finalString; // the memory finalString pointed to is in the HEAP space.
}
int main() {
char * p = makeString('*',5);
printf("%sn",p);
free(p); // free up the HEAP space
return 0;
}
编译并运行代码。
gcc -Wall main.c ./a.out
输出
*****
数组在C中不是一流的类型——你可以用其他类型做很多你不能用数组做的事情。特别是,不能将数组作为参数传递给函数,也不能将其作为返回值返回。
由于这个限制,如果您为参数或返回类型声明了一个具有数组类型的函数,编译器将(静默地(将其更改为指针,实际上您将传递或返回指针。这就是这里发生的事情——返回类型被更改为char *
,并且您返回了一个指向超出范围的本地数组的指针,因此您最终得到的指针是悬空的。
您的代码不会编译。如果要返回数组,请执行char *
而不是char []
。函数返回后,像finalString
这样的局部变量就超出了作用域。
这里有三种方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *initString(char *a, char c, int n) {
memset(a, c, n);
a[n] = ' ';
return a;
}
char *makeString(char c, int n) {
char *a = malloc(n + 1);
memset(a, c, n);
a[n] = ' ';
return a;
}
int main(void) {
printf("%sn", memset((char [6]) { 0 }, '*', 5));
char s[6];
initString(s, '*', (sizeof s / sizeof *s) - 1);
printf("%sn", s);
char *s2 = makeString('*', 5);
printf("%sn", s2);
free(s2);
}