- 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/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!