Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,如何确定字符串中是否存在相互矛盾的(否定的)文本? //输入:a-b-a。这应该是矛盾的,因为“-a”是a的否定版本。 字符*检查; for(int i=0;i_C - Fatal编程技术网

在C语言中,如何确定字符串中是否存在相互矛盾的(否定的)文本? //输入:a-b-a。这应该是矛盾的,因为“-a”是a的否定版本。 字符*检查; for(int i=0;i

在C语言中,如何确定字符串中是否存在相互矛盾的(否定的)文本? //输入:a-b-a。这应该是矛盾的,因为“-a”是a的否定版本。 字符*检查; for(int i=0;i,c,C,我基本上是想检查是否有任何相反(否定)的文字,并尝试了许多方法似乎无法得到它的权利。我将所有文字都设置为正数,并检查每个文字是否匹配。我移动了很多东西,在这条路上走了太长时间,但似乎什么都不起作用,所以我的大脑已经死了。 如果我删除了第一条If语句,并且没有将其转换为肯定,那么它会起作用您的帖子(和评论)中的文字很好地描述了您的意图,但我无法理解其中的一些代码。(这是a可能会有好处的地方。)因此,主要根据您的问题描述工作 给出了可能被否定的原子对输入字符串的描述(使用描述),以下实现中使用了这些

我基本上是想检查是否有任何相反(否定)的文字,并尝试了许多方法似乎无法得到它的权利。我将所有文字都设置为正数,并检查每个文字是否匹配。我移动了很多东西,在这条路上走了太长时间,但似乎什么都不起作用,所以我的大脑已经死了。 如果我删除了第一条If语句,并且没有将其转换为肯定,那么它会起作用

您的帖子(和评论)中的文字很好地描述了您的意图,但我无法理解其中的一些代码。(这是a可能会有好处的地方。)因此,主要根据您的问题描述工作

给出了可能被否定的原子对输入字符串的描述(使用描述),以下实现中使用了这些假设/步骤:

假设:
字符串文字的格式可以是:
constchararray[]={“a-bc-d-a”}

原子元素最多两个字符长(用于说明)
当基本元素类型(例如
a
具有相应的
-a

步骤:

  • 确定集合中元素的计数
  • 为count元素创建容器
  • string literal
    中的元素解析到容器中
  • 循环遍历每个元素以找到不同长度的对应元素
下面是一个粗略的实现,它标记并保持集合中否定对的计数:

//input: a -b -a. This should contradict as '-a' is negated version of a.
char*check;
for (int i = 0; i < this_element_of_arrayLength; i++) {
     for (int j = 0; j < this_element_of_arrayLength; j++) {

         if (this_element_of_array[i]) == 2) {   //checking if char (a or -a) is of 2 length   
              check = str_replace(this_element_of_array[i], "-", "");
         }

         if (check == this_element_of_array[j]) {
              printf("Contradiction");
              exit(0);
         }    
     }
}
typedef结构{
charele[3];
内伦;
布尔否定;
}Ele;
内部主(空)
{
//常量字符数组[]={“-a-b-c-d-e-a-f-g-f-h-i-jk”};
//常量字符数组[]={“a-bc-dee-afg-fhijk”};
//常量字符数组[]={“abcdafgf”};
常量字符数组[]={“-b-b-c-c a”};//每个注释
char*tok=NULL;
int countNegated=0;
int len=strlen(数组);
整数计数=0;
//计数元素

对于(int i=0;i恐怕你的解释不太清楚——无论如何,对我来说不是。你在解析表达式吗?什么是“文字”,数字?也许你可以给出一个输入示例和预期的输出。
str_replace(文字,“-”,”)如果不包含任何
-
,则
将返回原始文本。在删除
-
之前,需要先检查它是否为负数。在C中,不能使用
=
来比较字符串,必须使用
strcmp()
.A会很有用。现在还不清楚这些代码应该做什么。我看到您在代码中的某个点比较
char*
值,所以也许您应该改为比较字符串内容?您指的是什么???也就是说,正文本只是一个原子(例如,
x
)。负文本是原子的否定(例如,
-x
),您是否询问此否定文本是否可能嵌入到字符串中,即被其他字符包围?(提供一些实际输入字符串的示例。)谢谢,strstr似乎工作得很好。但是出于某种原因,循环似乎在所有迭代的最后使程序崩溃。知道为什么吗?@thome.steve-我测试了代码顶部显示的每个输入字符串。但是,我没有检查所有的大小写。您使用的是什么输入字符串?我使用了(-b-b-c-ca),在所有情况下,for循环都会继续进入main方法,这是同样的问题。我已尝试更改循环max,并尝试删除循环altoge的内容。在我的情况下,我不需要跟踪否定情况的数量,而是如果有否定情况,则立即停止程序。因此,对于没有否定情况的情况否定,它将在所有情况下运行,并在最外层的末尾停止代码loop@thome.steve-我在同一个代码库中运行了
const char array[]={“-b-b-c-ca”};
,没有看到崩溃。要解决这个问题,我必须查看您使用的实际代码库(在最小可编译示例中,包括重现问题的能力。)或者,您可以在调试器中运行它,通过单步执行代码来查看变量值。如果您选择发布实际代码,请在新问题中执行,然后在注释中标记我,我将进行查看。现在,请查看我的编辑以显示新字符串,并在内存中显示结果图像。
typedef struct {
    char ele[3];
    int len;
    bool negated;
}Ele;

int main(void)
{
    //const char array[] = {"-a -b -c -d -e -a -f -g -f -h -i -J k"};
    //const char array[] = {"a -b c -d e -a f g -f h i J k"};
    //const char array[] = {"a b c d a f g f"};
    const char array[] = {"-b -b -c -c a a"};//per comments

    char *tok = NULL;
    int countNegated = 0;

    int len = strlen(array);

    int count = 0;

    //count elements
   for(int i=0;i<len;i++)
   {
       if(array[i] == ' ') count++;
   }
   count += 1;
   Ele e[count] = {0};//assuming form of either "-a" or "a" with single character 
   //separate array into searchable discrete strings
   int i=0;
   tok = strtok(array, " ");
   while(tok != NULL)
   {
       strcpy(e[i].ele, tok);
       e[i].len = strlen(tok);
       e[i].negated = FALSE;
       tok = strtok(NULL, " ");
       i++;
   }
   //With data encapsulated, walk through elements of collection
   //1-by-1, comparing each to those that are downstream to find 
   //same type but different length elements.  This is done using
   //a single loop, with a branche to accommodate the length of
   //each new element against all of its downstream elements:
   int j=0;
   for(i=0;i<count;i++)
   {
        if(e[i].len == 1)
        {
            for(j=i;j<count;j++)
            {
                if((e[j].len == 2) && strstr(e[j].ele, e[i].ele))
                {
                    countNegated++;
                    e[j].negated = TRUE;
                    e[i].negated = TRUE;
                }       
            }
        }
        else //len == 2)
        {
            for(j=i;j<count;j++)
            {
                if((e[j].len == 1) && strstr(e[i].ele, e[j].ele)) 
                {
                    countNegated++;
                    e[j].negated = TRUE;
                    e[i].negated = TRUE;
                }       

            }
        }
   }



    return 0;
}