-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);

  }

当我遵守这一点时,我得到一个错误: void value not ignored as it should be. 现在 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 回答