【问题标题】:C - Modifying function parameterC - 修改函数参数
【发布时间】:2014-05-07 20:45:10
【问题描述】:

我正在尝试模拟通过引用传递,但显然我做错了什么:

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:改回来了,抱歉。 我想让它像这样工作: 输入 = 123 456 -> 数字 = 123,输入 = 456 -> 数字 = 456,输入 = NULL

【问题讨论】:

  • 通过更改问题中的代码,您已更改问题并使任何现有答案无效。您修改后的代码,当我在我的系统上运行它时,会因分段错误而死,因为它试图修改字符串文字。
  • 发布示例时,有助于说明预期结果。所以你希望函数返回 123456... 并且字符串会以某种方式改变?
  • 我希望它返回 123 并将输入更改为“456”。

标签: c string function parameter-passing


【解决方案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]

【讨论】:

  • 完美,谢谢!只有我必须将其编辑为“strtol(*input,...”。“-1337”是一个任意选择的数字,用于指示无效解析。
【解决方案2】:

input 是一个指针,它按值 传递给您的toNumber 函数。为input 赋值只会更改函数本地的参数对象。它对调用者没有影响。

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

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

【讨论】:

  • 我试过 *input = *pointer 也无济于事。我认为这对我的场景很有用,我有一长串一组长度的数字和单词,如果其中一个输入错误,这样我就可以丢弃整个东西,而不会浪费时间将它分解成一个数组或类似的东西。还是谢谢。
猜你喜欢
  • 2013-12-13
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多