2

标题有点混乱,但很难描述。

在我们的 c 方法中:

char* wc(char** cmds, char** stringstoread, char** filename, char* result)
{

char arr[4];
    int count = 0; 

    while(*(cmds) != NULL)
    {
       if(strcmp(*(cmds), "-l") == 0) // Check each commands
         arr[count++] = 'l';
       else if(strcmp(*(cmds), "-c") == 0)
          arr[count++] = 'c';
       else if(strcmp(*(cmds), "-m") == 0)
          arr[count++] = 'm';
       else if(strcmp(*(cmds), "-w") == 0)
          arr[count++] = 'w';

       cmds++;
    }


    if(count == 0)
    {
      arr[0] = 'l', arr[1] = 'c', arr[2] = 'm',arr[3] = 'w';
    }

    while((*stringstoread) != NULL)
    {
      printf("inputs are %s \n", *(stringstoread));
      stringstoread++;
    }
return result;
}

我们处于调试模式 atm,但到目前为止,我们无法弄清楚为什么最后一个 while 循环会打印出这个:

inputs are input 1 


inputs are input 2 


inputs are -l 
inputs are -w 
inputs are -c 
inputs are -m 

当这样调用方法时,我们不知道 -l、-w -c 和 -m 是如何进入字符串存储的:

  char tresult[10000];
  char *tcmds[] = { "-l", "-w", "-c", "-m"};
  char *tinput[] = {"input 1 \n\n", "input 2 \n\n"} ;
  char *tfilename[] = {"fil 1", "fil 2"} ;

  char *tmp = wc(tcmds, tinput, tfilename, tresult);

这有点混乱,但希望有人能提供帮助,我们是 C 新手,所以认为我们遇到了对该语言的标准误解。

4

2 回答 2

5

您需要空终止您的数组。像这样:

char *tcmds[] = { "-l", "-w", "-c", "-m", NULL};
char *tinput[] = {"input 1 \n\n", "input 2 \n\n", NULL} ;
char *tfilename[] = {"fil 1", "fil 2", NULL} ;

原因是您在这些数组上循环,直到遇到空值。但是由于程序中定义的数组不会以空值结尾,因此您需要循环结束它们。

当你的循环结束时,你现在有未定义的行为,任何事情都可能发生。实际发生的情况是编译器将数组布置为彼此相邻,然后您从一个数组的末尾跑到相邻的数组中。

我没有检查您代码中的其他任何内容。毫无疑问还有更多的错误,但我认为这是对这个问题主要观点的解释。

于 2013-09-30T12:30:06.197 回答
0

另一种解决方案是传递每个数组中的项目数。如果这样做,签名应更改为:

char* wc(char** cmds, int cmdCount, char** stringstoread, int stringStoreCount, char** filename, int fileNameCount, char* result);

如果你这样做,你必须省略 NULL 终止。当然,'while' 循环内部的条件也不同。

于 2013-09-30T12:36:51.180 回答