【问题标题】:Making Test cases?制作测试用例?
【发布时间】:2013-02-24 06:58:07
【问题描述】:

我是 C 新手,我正在尝试制作测试用例来测试节点交换,但不知道如何制作测试用例。如果有人能给我举个例子,那就太好了。谢谢

有人能告诉我我在交换函数中做错了什么,因为值没有被交换吗?

#include <stdio.h>
#include <stdlib.h>


 struct lnode {
    int data;
    struct lnode* next;
 };


 void swap(int* a, int* b );

 int main()
    {
      int x = 10;
  int y = 14;

  swap(&x, &y);
  swapNodes(x, y);
  getchar();
  return 0;
    }

   void swap(int* a, int* b )
  {
  int* temp;
  temp = a;
  a = b;
  b = temp;

  printf("x= %d  y= %d",*a,*b);
   }

   void swapNodes(struct lnode* n1, struct lnode* n2)
   {
    struct lnode* temp;
    temp = n1->next;
    n1->next = n2;
    n2->next = temp;
   }

【问题讨论】:

    标签: c


    【解决方案1】:

    从最简单的测试用例开始。您需要两个节点来进行节点交换。只需声明两个节点结构,为每个节点分配不同的值,交换节点并打印结果。像这样的:

    struct lnode nodeA, nodeB;
    
    nodeA.data = 1;
    nodeB.data = 2;
    
    swapNodes(&nodeA, &nodeB);
    
    printf("nodeA has value %d, should be 2\n", nodeA.data);
    printf("nodeB has value %d, should be 1\n", nodeB.data);
    

    【讨论】:

      【解决方案2】:

      swap函数错误,这样修改

      void swap(int* a, int* b )
      {
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
        printf("x= %d  y= %d",*a,*b);
      }
      

      那么您正在更改值,因为您无法使用这些参数更改 ab 所指向的内容

      它不起作用的原因是这个

      void swap(int* a, int* b )
      {
        int* temp; // pointer 
        temp = a;  // temppointing to same as a is pointing to
      
              +------------+
      temp -> | some value |
              +------------+
      
        a = b;   // a now pointing to same as b is pointing to  
      
           +------------------+
      a -> | some other value |
           +------------------+
      
        b = temp;  // b now pointing to same as temp pointing to, a
      
           +------------+
      b -> | some value |
           +------------+
      

      但是当你从函数返回时,指针保持不变。如果你想改变a`b point to you need to have argumentsswap(int **a, int **b)`

      类似

      int foo(int a) {
      a = 123;
      }
      
      int a = 1;
      foo(a);
      

      foo的调用不会改变参数,它只是被复制然后修改,当从函数返回时a仍然是它的原始值。

      int foo(int* a)
      {
        *a = 1;
      }
      

      改变的不是a指向的值而是值,但a仍然指向同一个点

      int foo(int**a )
      {
        *a = malloc(sizeof(int)); // changes where a points to
      ...
      }
      

      【讨论】:

        【解决方案3】:

        进行测试非常容易。使用预处理器宏,您可以毫不畏惧地做到这一点。例如,您有:

        int main()
        {
          int x = 10;
          int y = 14;
        
          swap(&x, &y);
          swapNodes(x, y);
          getchar();
          return 0;
        }
        

        做起来

        #define TEST
        #ifndef TEST
        int main()
        { //regular running
          int x = 10;
          int y = 14;
        
          swap(&x, &y);
          swapNodes(x, y);
          getchar();
          return 0;
        }
        #endif
        #ifdef TEST
            int main()
        {
            //test your code!
            return 0;
        }
        #endif
        

        # 是制作 C 时的指令。#define TEST 表示“我们处于测试模式”。 #ifndef TEST 表示“如果我们不进行测试”。 #ifdef TEST 表示“如果我们正在测试”。我们本来可以使用

        } //end regular main
        #else
        int main() //begin test main
        

        但这并不重要。请注意 #define 行位于所有 #ifdef#ifndef 行之前。

        如果仍然没有帮助,您可能想尝试使用预处理器宏来覆盖打印语句

        #define DEBUG
        #ifdef DEBUG
        #include <stdio.h>
        #endif
        
        ...
        
        void myFunc(){
            int x = 0;
            #ifdef DEBUG
            printf("%d", x);
            #endif
        }
        

        如果你真的想,你可以在编译期间定义东西(这被认为是更高级的)。

        gcc -DDEBUG -DTEST -o swap_test swap.c
        

        如果这些对您没有帮助,您应该查看GDB 来调试您的代码。如果您使用的是 Ubuntu,我认为它在软件中心。

        至于你的代码到底有什么问题?好吧,我不会告诉你,因为从长远来看这对你没有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-13
          • 2012-10-03
          • 1970-01-01
          • 2017-12-25
          相关资源
          最近更新 更多