-4
  void mark(char arr[],int s[][50],int i,int j){
   if(j>i)
      arr = "("+mark(arr,s,i,s[i][j])+"*"+ mark(arr,s,s[i][j]+1,j)+ ")";
   else
      sprintf(arr, "%s%d", "M",i);

  }

これに準拠すると、エラーが発生します。無効な値は無視されないはずです。現在 arr は、生成された最終的なブラケットとアルファベットの値を格納するのに十分な大きさの文字配列です。このコードを C で実装しようとしていますが、完全な初心者です。誰かが文字列を連結する方法を教えてください(javascriptで「+」演算子を使用するなど)。C の学習をどこから開始するか (初心者向け) についての提案も大歓迎です。

4

2 に答える 2

1

mark文字列処理の問題に加えて、式の中で関数を再帰的に呼び出し、結果を期待します。ただし、それを返すvoidと宣言したため、実際には関数から何も返されません。

編集:次のようなものはどうですか(テストされていません!):

char *mark(char arr[], int s[][50], int i, int j)
{
    if (j > i)
    {
        sprintf(arr, "(%s * %s)",
            mark(arr, s, i, s[i][j]),
            mark(arr, s, s[i][j] + 1, j));
    }
    else
        sprintf(arr, "M%d", i);

    return arr;
}
于 2012-08-27T13:35:08.610 に答える
0

あなたがしようとしている方法で文字列を追加できないことは正しいです。それはCではうまくいきません。しかし、このエラー:

error: void value not ignored as it ought to be

その問題とは何の関係もありません。これは、何も返さない関数からの戻り値を使用しようとしているためです。

  void mark(char arr[],int s[][50],int i,int j) //void means it returns nothing

    arr = "("+mark(arr,s,i,s[i][j])+      // This says store into arr "(" + nothing

コンパイラはそのステートメントをどう処理するかを認識していないため、上記のエラーをスローします。その問題を修正すると (mark() にリターンを追加するか、それを修正するためにやりたいことは何でも)、次のようなエラーが発生します。

error C2110: '+' : cannot add two pointers

また:

error: invalid operands to binary + (have ‘char *’ and ‘char *’)

またはコンパイラに応じてそのようなもの。これは、あなたが述べたように、C ではそのような文字列を追加できないためです。文字列を連結するには、strcat を使用する必要があります。

char str_one[1024] = "hello";  //something big enough for whatever your putting in it... size is up to you
char str_two[] = " world";
strcat(str_one, str_two);      //str_one now has "hello world"
于 2012-08-27T14:35:43.033 に答える