c中字符串与字符数组的比较

标签 c arrays string structure string-comparison

我正在尝试编写用于编码和解码目的的代码。一旦我们有了字典,形成的字典就存储在结构数组中。其结构如下

typedef struct Tuple {
    char a;
    char* cod;
} result;

原字符串为字符数组

char str[100];

现在我们需要一种方法来将原始数组中的字符与形成的字典进行比较。 形成的字典是这样的

a ---0
b ---1
c ---01

示例:原始字符串为aabcab,则编码应为0010101

比较字符串和字典数据的代码如下,但是当代码执行时,结果如下:[警告]传递'strcmp'的参数2使得指针来自整数而不进行强制转换[默认启用] 。

如果有帮助,我们将不胜感激。

   for(i=0; i<strlen(str);i++)//read the original string;
   {
        j=0; 
        while(j<number_of_elements_in_dictionary)// for above example=3
        {
            if (strcmp(str[i],values[j]->a)==0) //compare original string character with the //dictionary
            {
                printf("%s", values[j]->cod);//print corresponding code from //dictionary
                j++; //check with the next value of the dictionary
            }
        }          
    }
    printf("last=%s", str_en);//To print the dictionary data corresponding to //the original string data

#include<string.h>
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
typedef struct node
{
        char ch;
        int freq;
        struct node *left;
        struct node *right;
}node;

typedef struct Tuple {
    char a;
    char* cod;
}result;
/*Declaring heap globally so that we do not need to pass it as an argument every time*/
/* Heap implemented  here is Min Heap */
node * heap[1000000];
result * values[200];
int heapSize;
	char * str;
	char str_en[100];
// str_en[0] = '\0';
/*Initialize Heap*/
void Init()
{
        heapSize = 0;
        heap[0] = (node *)malloc(sizeof(node));
        heap[0]->freq = -INT_MAX;
}
/*Insert an element into the heap */
void Insert(node * element)
{
        heapSize++;
        heap[heapSize] = element; /*Insert in the last place*/
        /*Adjust its position*/
        int now = heapSize;
        while(heap[now/2] -> freq >= element -> freq) 
        {
                heap[now] = heap[now/2];
                now /= 2;
        }
        heap[now] = element;
}
node * DeleteMin()
{
        /* heap[1] is #ifndef

#elif

#endifthe minimum element. So we remove heap[1]. Size of the heap is decreased. 
           Now heap[1] has to be filled. We put the last element in its place and see if it fits.
           If it does not fit, take minimum element among both its children and replaces parent with it.
           Again See if the last element fits in that place.*/
        node * minElement,*lastElement;
        int child,now;
        minElement = heap[1];
        lastElement = heap[heapSize--];
        /* now refers to the index at which we are now */
        for(now = 1; now*2 <= heapSize ;now = child)
        {
                /* child is the index of the element which is minimum among both the children */ 
                /* Indexes of children are i*2 and i*2 + 1*/
                child = now*2;
                /*child!=heapSize beacuse heap[heapSize+1] does not exist, which means it has only one 
                  child */
                if(child != heapSize && heap[child+1]->freq < heap[child] -> freq ) 
                {
                        child++;
                }
                /* To check if the last element fits ot not it suffices to check if the last element
                   is less than the minimum element among both the children*/
                if(lastElement -> freq > heap[child] -> freq)
                {
                        heap[now] = heap[child];
                }
                else /* It fits there */
                {
                        break;
                }
        }
        heap[now] = lastElement;
        return minElement;
}
void encode(result *value, int s)
{
int pos,i,j;
pos=1;
	 values[pos]=value;//Im here
	 values[pos]->a =value->a;
	 values[pos]->cod=value->cod;
	                
                printf("RESULT= %c and %s", values[pos]->a, values[pos]->cod);
        
                pos++;
                
            /*the problem exists here while executing the following for-loop, the code doesn't execute due to this for loop*/
            
               for(i=0; i<strlen(str);i++){
               	j=0;
               	while(j<4)
				   {
				   	if(str[i]==values[j]->a)
				   	{
				   		printf("%s", values[j]->cod);
				   		j++;
				  	}
				   }		   }
				     
				  printf("last=%s", str_en);
				  
  
  }
void print(node *temp,char *code, int s)//, char *buf)
{
	 
	int i,pos=1,j;
        if(temp->left==NULL && temp->right==NULL)
        {
                printf("\n\nchar %c code %s\n",temp->ch,code);
                result * value = (result *) malloc(sizeof(result));
                value->a=temp->ch;
                value->cod= code;
              encode(value,s);
               
		return;
            
               
        }
        int length = strlen(code);
        char leftcode[512],rightcode[512];
        strcpy(leftcode,code);
        strcpy(rightcode,code);
        leftcode[length] = '0';
        leftcode[length+1] = '\0';
        rightcode[length] = '1';
        rightcode[length+1] = '\0';
        print(temp->right,rightcode,s);
        print(temp->left,leftcode,s);
     
    }    

/* Given the list of characters along with their frequencies, our goal is to predict the encoding of the
   characters such that total length of message when encoded becomes minimum */ 
int main()
{
	char buf[250];

	char character[26]; 
	 int i = 0,j=0,count[26]={0}; 
    char c = 97;
        Init();
      int distinct_char=0 ;
     
        char ch;
        int freq;       
        int iter;
    
        printf("enter the string");
        scanf("%s", str);
        printf("string=%s",str);
        for (i=0; i<strlen(str);i++)
        {
        	 
        for(j=0;j<26;j++)
            {
            if (tolower(str[i]) == (c+j))
                {
                    count[j]++;
                }
        }
    }
    for(j=0;j<26;j++)
        {
			if(count[j]>0)
			{

            printf("\n%c -> %d",97+j,count[j]);
            distinct_char++;
            character[j] = 97+j;    
			}

    	}
    	printf("\n number of distinct_characters=%d\n", distinct_char);  
	
	 
	     if(distinct_char==1)
        {
              printf("char %c code 0\n",c);
              return 0;
        }
        
         for(j=0;j<distinct_char;j++)
        {
        	printf("\ncharacter= %c and the frequency=%d", character[j],count[j]);
        	 node * temp = (node *) malloc(sizeof(node));
                temp -> ch = character[j];
                temp -> freq = count[j];
                temp -> left = temp -> right = NULL;
                Insert(temp);
            
        } 
        for(i=0;i<distinct_char-1 ;i++)
        {
                node * left = DeleteMin();
                node * right = DeleteMin();
                node * temp = (node *) malloc(sizeof(node));
                temp -> ch = 0;
                temp -> left = left;
                temp -> right = right;
                temp -> freq = left->freq + right -> freq;
                Insert(temp);
        }
        node *tree = DeleteMin();
       
        
        char code[512];
        code[0] = '\0';
 
   print(tree,code, distinct_char);
  

}

最佳答案

正如警告所示,您在这里缺少一个指针。 strcmp 的签名为

int strcmp(const char *s1, const char *s2);

但两个参数实际上都是 char 类型(数组索引从 char* 生成 char,就像常规取消引用一样)无论如何,第二个参数是一个 char)。

但是,您真正想要的是将字符串中的单个字符与另一个字符进行比较。您可以只使用常规关系运算符:

if(str[i] == values[j]->a) 
{
    // ...
}

请注意,这只是回答您的确切问题,但您的代码可能是错误的或无效的。

关于c中字符串与字符数组的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697088/

相关文章:

c++ - 链接问题与 g++ 有关,但与 cc 无关

arrays - 如何将 PostgreSQL 中带有 JSON 数组字段的表解析为行?

java - 从字符串中删除指定字符

Java替换字符串2

javascript - 从字符串中剥离一些字符

在 scilab 中从 xcos 生成 C/C++ 代码

C编程输入错误

java - 交换数组中的两个字符串,Java

vb.net - 清除字符串数组的最佳方法是什么?

c - double sscanf