【发布时间】:2013-07-11 20:05:15
【问题描述】:
我有这个小问题,无法解决。
问题是我试图通过要求用户插入它来加载函数LOAD 中的所有四个字符串。一切似乎都很好,我没有收到任何编译器错误。但是eaf 保持空。我尝试了很多方法,甚至将scanf替换为gets、gets_s、fgets,但没有任何改变。
#include <conio.h>
#include <stdio.h>
#include <string.h>
void LOAD(char eaf[], char initials[], char finals[], char symbols[]);
int COMPARE(char s[], char eaf[]);
int main()
{
char eaf[10],initials[1],finals[10],symbols[5];
LOAD(eaf, initials, finals, symbols);
return 0;
}
void LOAD(char eaf[], char initials[], char finals[], char symbols[])
{
printf("Insert states of the optimized AFD\n");
scanf( " %s", eaf);
printf("Insert AFD initial state\n");
do
{
scanf( " %s", initials);
} while (COMPARE(initials, eaf));
printf("Insert final state(s)\n");
do
{
scanf( " %s",finals);
} while (COMPARE(finals, eaf));
printf("Insert the language symbols\n");
scanf( " %s",symbols);
}
int COMPARE(char s[], char eaf[])
{
int i;
char *ptr;
for(i; i < strlen(s); i++){
printf("%d\n", i);
while(ptr==NULL){
ptr = strchr(eaf, *s);
}
}
if (ptr == NULL) return 1;
else return 0;
}
我做错了什么?这只是更大程序的一小部分,但其余部分无用,因为eaf 是空的。我认为问题出在使用scanf,但正如我所说的,其他功能也不能正常工作。我希望任何人都可以帮助我。谢谢
编辑:我检查了strlen(eaf)
【问题讨论】:
-
您忘记在 COMPARE 中初始化
i。 (另外,不要将任何不是#defined 宏的内容全部大写。) -
注意:不要在循环测试中调用
strlen。这需要strlen在每次迭代时遍历整个字符串。许多编译器可以对其进行优化,但是当它碰巧没有被优化时,性能就会像石头一样下降。在循环外计算一次长度。 (我会抱怨固定大小的缓冲区和scanf,但修复这些需要更多的工作。) -
initials[1]和scanf( " %s", initials);。您超出了数组边界,看起来initials的 0 终止符被写入了eaf。 -
您的比较功能并不是很有用。使用
gcc -Wall -Werror ...编译您的程序。 -
while(ptr==NULL){ptr 在 COMPARE() 中未初始化