帮助我,大师
/*
* In this function, I want the static variable position to point to next element
* of the str, every time I call this function.
*/
void function(char *str){
static char *position = str;
/* Do something here to this position */
position += 1;
}
这个程序的目的是做字符串替换,每次我替换str的模式我必须让静态位置变量指向str的新位置,然后我将每个东西复制到另一个新的串。
问题是,编译器一直告诉我“初始化元素不是常量”,我该如何解决这个问题?
答案 0 :(得分:9)
你的函数中不能有一个静态变量指向str
的下一个元素,因为position
是一个初始化一次的全局变量,str
可能有每次调用函数时都会有不同的值。
这里需要的是一个迭代str
,
void func1(char *str) {
char *p;
for (p = str; /* some condition here */; ++p) {
/* Do something here to this position */
}
}
或在此函数外部有一个循环,并且每次迭代都会将str
递增1。
void func1(char *str) {
/* Do something here to this position */
}
void func2() {
char *str = ...;
...
char *p;
for (p = str; /* some condition here */; ++p) {
func1(p);
}
}
当然,您可以首先将静态初始化为NULL
并使用它来检查您是否开始迭代str
,但这样的风格很差:太有状态且容易出错,不可重入而不是线程-safe。
答案 1 :(得分:7)
你需要做的是找到一些方法来决定你是否在字符串的开头,在这种情况下你重置position
,或者不重置,在这种情况下你增加它:
/*
* In this function, I want the static variable position to point to next element
* of the str, every time I call this function.
*/
void function(char *str){
static char *position;
if (str) {
position = str;
} else {
/* Do something here to this position */
position += 1;
}
}
现在当str
为NULL
时,该函数假定您继续使用与之前相同的字符串,并且当它不是NULL时,它假定您正在使用新的字符串。
答案 2 :(得分:5)
这不是C的做事方式 - 它不是重新开始的 - 但如果你绝对必须:
/*
* In this function, I want the static variable position to point to next element
* of the str, every time I call this function.
*/
bool function(char *str){
static char *last_str;
static char *position;
if (str != last_str)
last_str = position = str;
/* Do something here to this position */
if (*position != '\0')
++position;
else
last_str = NULL;
return *position != '\0';
}
然后您可以执行以下操作:
while (more) {
// do something
more = function(string);
}
答案 3 :(得分:1)
static char *position = str;
此错误背后的真正原因是,由于position
是一个全局变量,因此只能使用编译时常量进行初始化。如果你尝试
#include <stdio.h>
int j = 9;
static int k = j + 3; /* Error */
int main(){}
j
和str
都不是编译时常量,因此错误。
答案 4 :(得分:1)
正如其他人所提到的,在这里使用static
变量是一个坏主意。我会详细说明错误:
在C中,具有静态存储持续时间的变量(全局变量和static
变量)在程序启动之前初始化。因此,这需要提前知道初始值,并且必须是编译时常量。
在C ++中有点不同,也许这就是你期望的行为。具有静态存储持续时间的变量可以动态初始化。对于全局变量,这意味着在程序启动期间以某种未指定的顺序;对于函数中的static
变量,这意味着它们在首次执行函数时被初始化。
答案 5 :(得分:1)
void func1();
char str[10] = "good";
int main()
{
func1();
return 0;
}
void func1()
{
static char *pos = &str[0];
pos++;
(pos) ? printf("%s\n",pos) : 0;
}
这个程序会做。我在全局区域中使用ReadWrite区域编写了字符串,该区域是全局初始化区域,并在函数内部分配字符串的起始地址。首先打印“ood”,第二次打印“od”......