0

プログラムを完成させるのに苦労しています。いくつかのエラーがあり、何を修正すればよいかわかりません。私の使命は、ユーザーから 2 つの文字列を取得するプログラムを作成することです。それらを印刷してから並べ替えて、2 つの文字列をマージして並べ替えて 1 つにする関数を作成する必要があります。しかし、名前が最初の文字列と2番目の文字列に表示される場合、3番目は両方の結合であり、2つの文字列がソートされた順序で存在し、重複しない名前を1回だけ表示します文字列の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");
}
4

3 に答える 3

2

strcpy関数を使用して文字列をコピーする必要があります

修正ライン No. 45 & 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);
    }
于 2013-09-19T16:42:46.260 に答える
0

2次元配列があるため、そのように並べ替えることができないため、このコードはその目的には正しくありません

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

2 つの配列を別の配列と交換する場合は、strncpy などのように、1 つの配列から別の配列に文字を物理的にコピーする必要があります。

より効果的な方法は、文字列へのポインターの配列を作成してから、ポインターを交換することです。

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;
}
于 2013-09-19T16:51:32.487 に答える
0

左辺値とは何かを理解する必要があります。これは C の非常に重要な概念です。

基本的に、左辺値は、変数のように値を割り当てることができる値です。

この行:

text1[i+1]=text1[i]

一度に値の行全体を割り当てようとします。 text1[i + 1]は左辺値ではないため、ステートメントは不正です。

データ構造を文字列の配列 ( char*)として定義することをお勧めします。

char* text1[LINES];

ただし、メモリを割り当てて初期化するには、もう少し設定を行う必要があります。

于 2013-09-19T16:52:27.337 に答える