C - 修改功能参数

时间:2014-05-07 20:45:11

标签: c string function parameter-passing

我试图通过引用模拟传递,显然我做错了什么:

long int toNumber(char * input) {
   char* pointer;
   long int number;
   number = strtol(input, &pointer, 10);
   if (number == 0L) {
       return -1337;
   } else {
       input = pointer;
       return number;
   }
}

我喜欢这个函数返回输入的值并修剪它的转换开头,但是当我尝试调用它时,即使整数转换完美无缺,字符串保持不变。感谢您提供任何帮助。

编辑:

    char* input = "123 456"; 
    long int number = toNumber(input);

编辑2:改回来,抱歉。 我希望它可以像这样工作: input = 123 456 - > number = 123,input = 456 - > number = 456,input = NULL

2 个答案:

答案 0 :(得分:1)

input是一个指针,它通过传递给toNumber函数。为input赋值只会更改参数对象,该对象是函数的本地对象。它对来电者没有影响。

要修改字符串,您必须修改*inputinput[some_index],或将input传递给将修改其指向的数据的其他函数。

请注意,更新字符串不一定是个好主意。您可以修改组成字符串的字符,但不能增加包含该字符串的数组的大小。如果调用者传递一个字符串文字,那么尝试修改它有未定义的行为(并且可能会使程序崩溃)。

答案 1 :(得分:1)

目前尚不清楚1337的事情......但是,这段代码应该产生问题代码尝试简化逻辑的内容。

long int toNumber(char **input) 
   { 
   char *pointer;
   long int number;

   number = strtol(input, &pointer, 10);
   if(number)
      *input = pointer;
   else
      number = (1337);

   return number;
   }

如下所示调用上述函数:

   {
   char *test="123 456";
   long int n;

   ...

   n = toNumber(&test);

   printf("n[%ld] remainder[%s]\n", n, test);       
   ...

   }

哪个应该打印:

n[123] remainder[ 456]