我一直在设计测试功能作为任务的一部分,我被困在一个部分。基本上,为了让循环退出,我需要状态为9,s字符串为“reset \ 0”。在测试中,我可以达到状态9,这意味着inputChar()可以正常工作。另一个测试表明inputString()正在生成一个有效的字符串,但是s没有正确获取该值。我认为它必须是一个指针问题,btu我经过一段时间的修补后无法弄清楚是什么。
int RandInt(int low, int high) {
return low + rand() % (high - low + 1);
}
char inputChar()
{
return RandInt(' ', '}');
}
char *inputString()
{
int i;
char* iString[6];
for (i = 0; i< 5; i++){
iString[i] = RandInt('e', 't');
}
iString[5] = '\0';
return iString;
}
void testme()
{
int tcCount = 0;
char *s;
char c;
int state = 0;
while (1)
{
tcCount++;
c = inputChar();
s = inputString();
printf("Iteration %d: c = %c, s = %s, state = %d\n", tcCount, c, s, state);
if (c == '[' && state == 0) state = 1;
if (c == '(' && state == 1) state = 2;
if (c == '{' && state == 2) state = 3;
if (c == ' '&& state == 3) state = 4;
if (c == 'a' && state == 4) state = 5;
if (c == 'x' && state == 5) state = 6;
if (c == '}' && state == 6) state = 7;
if (c == ')' && state == 7) state = 8;
if (c == ']' && state == 8) state = 9;
if (s[0] == 'r' && s[1] == 'e'
&& s[2] == 's' && s[3] == 'e'
&& s[4] == 't' && s[5] == '\0'
&& state == 9)
{
printf("error ");
exit(200);
}
}
}
运行上面的输入将永远运行,因为s只是一个字符,而不是“reset \ 0”
答案 0 :(得分:2)
函数inputString返回其自动变量的地址,一旦您尝试使用它,就会导致未定义的行为。您可以修改inputString函数以接收指针作为其参数,并通过它提供其输出。
例如:
void inputString(char *iString)
{
int i;
for (i = 0; i< 5; i++){
iString[i] = RandInt('e', 't');
}
iString[5] = '\0';
}
并使用以下逻辑调用该函数:
char iString[6];
inputString(iString);
答案 1 :(得分:0)
您可以在此处找到代码中的问题:
char *inputString() { int i; char* iString[6]; for (i = 0; i< 5; i++){ iString[i] = RandInt('e', 't'); } iString[5] = '\0'; return iString; }
您返回了指向本地数组变量iString
的指针。重要的是,您要清楚地了解变量的“生命周期”。 iString
在inputString()
函数内 。{。}
当函数以最终return
语句退出时,该变量将被销毁。
因此,您返回了一个指向不再有效的字符串的指针。
您有几种选择:
您可以请求函数的调用者提供目标字符串缓冲区作为函数参数,并在函数内填充该缓冲区。
您可以使用static
局部变量(其生命周期扩展了函数范围),但我不太喜欢它。
您可以使用函数内部的malloc()
分配内存,并返回指向已分配内存的指针。函数的调用者必须使用free()
释放该内存。
另请注意,如果您想在C中使用字符串,则可以执行
char iString[6]; /* C string with max. 5 chars + NUL terminator */
不
char* iString[6]; /* array of pointers to char's/strings */