对数组中的2个字符串进行排序,并将它们合并为C中的一个

时间:2013-09-19 16:40:28

标签: c string sorting

我遇到麻烦来完成我的程序我遇到了一些错误,我不知道该怎么做才能修复它们。 我的任务是构建一个程序,从用户获得2个字符串。我必须打印它们,然后在它之后对它们进行排序,以创建一个将两个字符串合并并排序为一个的函数。 但是如果一个名字出现在第一个字符串和第二个字符串中,那么第三个是两者的并集以排序顺序存在于两个字符串中,并且只显示一次不会重复的名称 我想这是关于字符串的malloc内存,但我真的不知道该怎么做!

1>c:\users\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(46): error C2106: '=' : left operand must be l-value
1>c:\users\roni\documents\visual studio 2010\projects\lb11_12\lb11_12\lb_11_12_02.c(47): error C2106: '=' : left operand must be l-value
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这是我的代码:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define LINES 4
#define length 100

void SortText1(char text1[LINES][length]);
void SortText2(char text2[LINES][length]);
void PrintStr1(char text1[LINES][length]);
void PrintStr2(char text2[LINES][length]);
void main ()
{
    int i;
    char text1[LINES][length];
    char text2[LINES][length];
    char text3[LINES+LINES][length];
    printf("First string,Please enter %d names (only capital letters,without spaces):", LINES);
    for ( i=0 ; i<LINES ; i++)
    {
        gets(text1[i]);
    }
    printf("Second string,Please enter %d names (only capital letters,without spaces):", LINES);
    for ( i=0 ; i<LINES ; i++)
    {
        gets(text2[i]);
    }
    PrintStr1(text1);
    PrintStr2(text2);
    SortText1(text1);
    system("pause");
    return ;
}
void SortText1(char text1[LINES][length])
{

    int i,j,k;
    for (i=LINES-1 ; i>0 ; i--)
    {
        for ( j=0 ; j<i ; j++ )
        {
            if(strcmp(text1[i],text1[i+1]) > 0 )
            {
                char *temp=text1[i+1];
                text1[i+1]=text1[i];
                text1[i]=temp;
            }
        }
    }
    printf("The first string sorted:\n");
    for ( k=0 ; i<LINES ; k++)
        {
            printf("%s ",text1[k]);
        }
    printf("\n");
}
void PrintStr1(char text1[LINES][length])
{
    int i;
    printf("The first string of NAMES:\n");
    for ( i=0 ; i<LINES ; i++)
        {
            printf("%s ",text1[i]);
        }
    printf("\n");
}
void PrintStr2(char text2[LINES][length])
{
    int i;
    printf("The second string of NAMES:\n");
    for ( i=0 ; i<LINES ; i++)
        {
            printf("%s ",text2[i]);
        }
    printf("\n");
}

3 个答案:

答案 0 :(得分:2)

您需要使用strcpy函数来复制字符串

Fix Line No. 45&amp; 46

    if(strcmp(text1[i],text1[i+1]) > 0 )
    {
        char *temp= malloc(sizeof(char)*strlen(text1[i+1])+1);
        strcpy(temp,text1[i+1]);
        strcpy(text1[i+1],text1[i]); // Line No. 45
        strcpy(text1[i],temp); //Line No. 46
        free(temp);
    }

答案 1 :(得分:0)

你将无法对它进行排序,因为你有一个2-dim数组,所以这段代码不正确

if(strcmp(text1[i],text1[i+1]) > 0 )
{
  char *temp=text1[i+1];
  text1[i+1]=text1[i];
  text1[i]=temp;
}

如果要将两个数组与另一个数组交换 你需要在物理上复制角色 从一个阵列到另一个阵列函数strncpy。

更有效的方法是创建一个 指向字符串的指针数组然后交换 指针。

char *text1[SIZE];
for (i = 0; i < SIZE; ++i)
  text1[i] = malloc(length);

...

fgets( text1[i], length, stdin );

...

然后您的交换功能将起作用

if(strcmp(text1[i],text1[i+1]) > 0 )
{
  char *temp=text1[i+1];  
  text1[i+1]=text1[i];     
  text1[i]=temp;
}

答案 2 :(得分:0)

您需要了解lvalue是什么。这是C中非常重要的概念。

基本上,左值是一个可以赋值的值,就像变量一样。

这一行:

text1[i+1]=text1[i]

尝试一次分配整行值。 text1[i + 1]不是左值,因此该声明是非法的。

最好将数据结构定义为字符串数组(char*),例如

char* text1[LINES];

但是你需要做更多的设置来分配和初始化内存。