- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 C 构建一个模式识别程序,它可以读取用户定义的字符串和用户定义的 4 个字符模式。然后该程序有一个函数来确定是否找到了模式以及最初在哪里找到该模式(根据输入文本索引)。
我知道这对你们大多数人来说都是基础知识,我只希望能快速成为一名更熟练的程序员。当我执行我的程序时,它以我无法理解的方式陷入无限循环。
我知道问题出在我的 FindMatch 函数上,而不出在输入文本和模式的读入上。我的 FindMatch 函数有什么问题?!请帮忙。
#include <stdio.h>
#include <stdlib.h>
char *getCharBlock(int *size);
int findmatchA(char *text, char *pattern, int tsize, int psize);
void printIt(char *ptr, int index, int size);
int main(){
char *text, *pattern; //pointers for the characters you will read
char *p,*q,*r; //some pointer variables
int tsize,psize,x,y,z; //some integers
printf("Please input a sequence of character text (characters only will be stored):");
text = getCharBlock(&tsize);
printf(" Now input the pattern you seek to search for: ");
pattern = getCharBlock(&psize);
x = findmatch(text,pattern,tsize, psize);
if(x== -1){
printf("No Match Found \n");
printf("No starting position for match exists \n");
}
else{
printf("Match Has Been Found! \n");
printf("Match starting position at index %d \n", x);
printf("Remaining text after Match: \n");
printIt(text, x+psize, tsize);
}
free(text);
free(pattern);
}
char *getCharBlock(int *size){
char *input = (char*) malloc (80*sizeof(char));
char a;
int i = 0;
a = getchar();
while(i<80 && a!= '\n'){
if( (a>= 'a' && a <= 'z') || (a>= 'A' && a <= 'Z') ){
*(input + i) = a;
i++;
}
a = getchar();
}
*size = i;
return input;
}
int findmatch(char *text, char *pattern, int tsize, int psize) {
int index = 0;
int state = 0;
while (psize <= tsize) {
if ((*(text + index) == *pattern) && state == 0){
state = 1;
index++;
printf( "test 1 \n");
}
else if ((*(text + index) != *pattern) && state == 0){
state = 0;
index++;
printf( "test1.1 \n");
}
else if (*(text + index) == *(pattern + 1) && state ==1) {
state = 2;
index++;
printf( "test 2 \n");
}
else if (*(text + index) != *(pattern + 1) && state ==1) {
state = 0;
printf("test 2.2 \n");
}
else if (*(text + index) == *(pattern + 2) && state ==2) {
state = 3;
printf("test 3 \n");
}
else if (*(text + index) != *(pattern + 2) && state ==2) {
state = 0;
printf("test 3.3 \n");
}
else if (*(text + index) == *(pattern + 3) && state ==3) {
state = 4;
printf("test 4 \n");
}
else if (*(text + index) != *(pattern + 3) && state ==3) {
state = 0;
printf("test 4.4 \n");
}
else {
return -1;
}
index++;
}
return index;
}
最佳答案
I know this is elementary to most of you, and I just hope to quickly become a more proficient programmer
祝你好运,我给你我的建议。
一些问题导致程序无法正常运行。
it gets stuck in an infinite loop in a manner I don't understand.
1) 你在这里有永远的循环:
`while (psize <= tsize) {`
psize
永远不会改变,它永远不会达到 tsize
并且循环永远不会结束。
但这不是唯一的问题。
2) text
和 pattern
的输入字符串不以 '\0' 结尾。
注意:malloc
不是 calloc
。分配的内存可以包含任何内容!为谨慎起见,您应该检查内存是否已正确分配。
3) 并非所有状态都正确地推进 index
变量:
else if (*(text + index) == *(pattern + 2) && state ==2) {
state = 3; // sg! index++; is missing!
printf("test 3 \n");
}
else if (*(text + index) != *(pattern + 2) && state ==2) {
state = 0;
printf("test 3.3 \n");
}
这会妨碍正确的模式匹配。
4) 未进行输入验证,例如:您应该确保 pattern 恰好是 4
个字符长。
如果我只能给你一个建议,那就是:“永远不要使用 if-else 链!”
。将其替换为 switch-case-break
结构。
您的 int findmatch
就是一个完美的例子。 if-else
链创建了难以调试的丛林。你们的状态非常相似,应该创造和谐。他们不是。您的功能可以替换为更简单的功能:
int findmatch(char *text, char *pattern, int tsize, int psize) {
int index = 0;
int state = 0;
printf("Text=<%s> pattern=<%s> tsize=%d psize=%d \n",text, pattern, tsize, psize);
while (index <= tsize) {
switch (state)
{
case 0:
state = next_state(text,pattern, "test 1", "test1.1", &index, 0, 1, 1);
break;
case 1: // pattern[0] matched
state = next_state(text, pattern, "test 2", "test2.2", &index, 1, 2, 0);
break;
case 2: // pattern [0] [1] matched
state = next_state(text, pattern, "test 3", "test3.3", &index, 2, 3, 0);
break;
case 3: // pattern [0] [1] [2] matched
state = next_state(text, pattern, "test 4", "test4.4", &index, 3, 4, 0);
break;
case 4:
printf("DONE, index = %d \n",index);
return index;
break;
default:
printf("We should not be here! \n");
break;
} // case
} // while
return -1;
}
编程就像创作音乐或绘画。你的创作应该是美丽的。保持和谐,保持平衡。
这是您学习的工作计划。
#include <stdio.h>
#include <stdlib.h>
char *getCharBlock(int *size);
int findmatch(char *text, char *pattern, int tsize, int psize);
void printIt(char *ptr, int index, int size);
void printIt(char *ptr, int index, int size)
{
}
int main(void){
char *text, *pattern; // pointers for the characters you will read
int tsize,psize,x; // some integers
printf("Please input a sequence of character text (characters only will be stored):\n");
text = getCharBlock(&tsize);
printf("Now input the pattern you seek to search for: \n");
pattern = getCharBlock(&psize);
x = findmatch(text, pattern, tsize, psize);
if(x == -1){
printf("No Match Found \n");
printf("No starting position for match exists \n");
}
else{
printf("Match Has Been Found! \n");
printf("Match starting position at index %d \n", x - 4);
printf("Remaining text after Match: <%s> \n", text + x );
printIt(text, x+psize, tsize);
}
free(text);
free(pattern);
}
char *getCharBlock(int *size){
char *input = (char*) malloc (80*sizeof(char) +1 );
if (input == NULL)
{
printf("No memory!\n");
exit(-1);
}
char a;
int i = 0;
a = getchar();
while( i<80 && a != '\n'){
if( ((a>= 'a') && (a <= 'z')) || ( (a>= 'A') && (a <= 'Z') ) ){
* (input + i) = a;
i++;
}
a = getchar();
}
* (input + i) = 0; // sg7! terminate the string
*size = i;
return input;
}
int next_state(char *text, char *pattern, char *m1, char *m2, int *index, int patternInd, int next_state, int advInd )
{
int state = 0;
if (text[*index] == pattern[patternInd]){
state = next_state;
printf( "%s\n", m1);
(*index)++;
}
else{
printf( "%s\n", m2);
if(advInd)
(*index)++;
}
return state;
}
int findmatch(char *text, char *pattern, int tsize, int psize) {
int index = 0;
int state = 0;
printf("Text=<%s> pattern=<%s> tsize=%d psize=%d \n",text, pattern, tsize, psize);
while (index <= tsize) {
switch (state)
{
case 0:
state = next_state(text,pattern, "test 1", "test1.1", &index, 0, 1, 1);
break;
case 1: // pattern[0] matched
state = next_state(text, pattern, "test 2", "test2.2", &index, 1, 2, 0);
break;
case 2: // pattern [0] [1] matched
state = next_state(text, pattern, "test 3", "test3.3", &index, 2, 3, 0);
break;
case 3: // pattern [0] [1] [2] matched
state = next_state(text, pattern, "test 4", "test4.4", &index, 3, 4, 0);
break;
case 4:
printf("DONE, index = %d \n",index);
return index;
break;
default:
printf("We should not be here! \n");
break;
} // case
} // while
return -1;
}
输出:
Please input a sequence of character text (characters only will be stored):
aaabcdef
Now input the pattern you seek to search for:
abcd
Text=<aaabcdef> pattern=<abcd> tsize=8 psize=4
test 1
test2.2
test 1
test2.2
test 1
test 2
test 3
test 4
DONE, index = 6
Match Has Been Found!
Match starting position at index 2
Remaining text after Match: <ef>
Please input a sequence of character text (characters only will be stored):
abcdefgh
Now input the pattern you seek to search for:
efgh
Text=<abcdefgh> pattern=<efgh> tsize=8 psize=4
test1.1
test1.1
test1.1
test1.1
test 1
test 2
test 3
test 4
DONE, index = 8
Match Has Been Found!
Match starting position at index 4
Remaining text after Match: <>
希望对你有所帮助。如果您有更多问题,请随时提问。
关于C编程;通过有限状态机程序识别字符模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49139483/
我使用的是linux的windows子系统,安装了ubuntu,bash运行流畅。 我正在尝试使用make,似乎bash 无法识别gcc。尝试将其添加到 PATH,但没有任何改变。奇怪的是 - cmd
ImageMagick 已正确安装。 WAMP 的“PHP 扩展”菜单也显示带有勾选的 php_imagick。除了 Apache 和系统环境变量外,phpinfo() 没有显示任何 imagick
我是这么想的,因为上限是 2^n,并且考虑到它们都是有限机,n 状态 NFA 和具有 2^n 或更少状态的 DFA 的交集将是有效。 我错了吗? 最佳答案 你是对的。 2^n 是一个上限,因此生成的
我有一个大型数据集,其中包含每日值,指示一年中的特定一天是否特别热(用 1 或 0 表示)。我的目标是识别 3 个或更多特别炎热的日子的序列,并创建一个包含每个日子的长度以及开始和结束日期的新数据集。
我有一个向量列表,每个向量看起来像这样 c("Japan", "USA", "country", "Japan", "source", "country", "UK", "source", "coun
是否有任何工具或方法可以识别静态定义数组中的缓冲区溢出(即 char[1234] 而不是 malloc(1234))? 昨天我花了大部分时间来追踪崩溃和奇怪的行为,最终证明是由以下行引起的: // e
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我想录下某人的声音,然后根据我获得的关于他/她声音的信息,如果那个人再次说话,我就能认出来!问题是我没有关于哪些统计数据(如频率)导致人声差异的信息,如果有人可以帮助我如何识别某人的声音? 在研究过程
我希望我的程序能够识别用户何时按下“enter”并继续循环播放。但是我不知道如何使程序识别“输入”。尝试了两种方法: string enter; string ent = "\n"; dice d1;
我创建了这个带有一个参数(文件名)的 Bash 小脚本,该脚本应该根据文件的扩展名做出响应: #!/bin/bash fileFormat=${1} if [[ ${fileFormat} =~ [F
我正在寻找一种在 for 循环内迭代时识别 subview 对象的方法,我基本上通过执行 cell.contentView.subviews 从 UITableView 的 contentView 获
我正在尝试在 Swift 中使用 CallKit 来识别调用者。 我正在寻找一种通过发出 URL 请求来识别调用者的方法。 例如:+1-234-45-241 给我打电话,我希望它向 mydomain.
我将(相当古老的)插件称为“thickbox”,如下所述: 创建厚盒时,它包含基于查询的内容列表。 使用 JavaScript 或 jQuery,我希望能够访问 type 的值(在上面的示例中 t
我想编写一些可以接受某种输入并将其识别为方波、三角波或某种波形的代码。我还需要一些产生所述波的方法。 我确实有使用 C/C++ 的经验,但是,我不确定我将如何模拟所有这些。最终,我想将其转换为微 Co
我创建了一个 for 循环,用于在每个部分显示 8 个项目,但我试图在循环中识别某些项目。例如,我想识别前两项,然后是第五项和第六项,但我的识别技术似乎是正确的。 for (int i = 0; i
如何识别 UIStoryboard? 该类具有创建和实例化的方法,但我没有看到带有类似name 的@property。例如 获取 Storyboard对象 + storyboardWithName:b
如何确定所运行的SQLServer2005的版本 要确定所运行的SQLServer2005的版本,请使用SQLServerManagementStudio连接到SQLServer2005,然后运行
这个问题在这里已经有了答案: How to check whether an object is a date? (26 个答案) 关闭2 年前。 我正在使用一个 npm 模块,它在错误时抛出一个空
我正在制作一个使用 ActivityRecognition API 在后台跟踪用户 Activity 的应用,如果用户在指定时间段(例如 1 小时)内停留在同一个地方,系统就会推送通知告诉用户去散步.
我是一名优秀的程序员,十分优秀!