为什么我在某些地方使用*,有些地方没有使用*

时间:2017-11-04 22:18:34

标签: c string pointers

所以我无法在C.中找出这个指针代码。基本上它从字符串中删除了数字。我很困惑为什么有些地方* src被使用而有些地方不是。还请解释这段代码是如何工作的。

char* RemoveDigits(char* input)
{
    char* dest = input;
    char* src = input;

    while(*src)
    {
        if (isdigit(*src)) 


       { src++; continue; } //here we are using src and not *src.
        *dest++ = *src++;
    }
    *dest = '\0';
    return input;
}

3 个答案:

答案 0 :(得分:2)

简答:

转到学习指针,只需几行答案就可以解释,这非常重要而且太棘手。一旦你这样做,就可以回答。

答案很长:

char* RemoveDigits(char* input) {
   char* dest = input;
   char* src = input;
   while(*src) { 
      if (isdigit(*src)) { 
         src++; continue; 
      } //here we are using src and not *src.
      *dest++ = *src++;
   }
   *dest = '\0'; return input;
}

要理解此代码,您需要了解char数组在C中的工作方式。 如果您声明' char [5]示例=" test&#34 ;;'变量'示例'将是一个指向数组的第一个字符的指针,这意味着它将包含内存地址,在这种情况下,' t'字符存储。

如果您输入' *示例'相反,你基本上是在说#34;给我存储在变量'例如'中指定的存储地址的值,这实际上意味着"给我第一个字母"事实上,如果你输入printf('%c',*示例),它将显示' T'。

一旦你理解了这一点,通过说"示例++"很容易猜到。你正在改变' T'到记忆中随后的下一个值' E'等等...

现在让我们转到另一个角度,这有什么作用? 一旦你了解了如何在C中管理char数组,这很容易理解。每个存储的char数组总是和' \ 0'字符。如果放入while语句中的每个字符都将被视为“真实”字符。除了' / 0'这将被视为“假”'。通过检查存储在src中的值并在结束时递增它,你会说"检查所有字符直到结束"

最后一件事:如果当前角色' * src'是一个数字字符只是传递给下一个字符并重新启动while而不执行下面的代码,否则如果相关字符将其写入目标数组' * dest = * src'然后增加' dest ++'和' src ++'为下一个角色准备空间。

我知道这是第一次有点复杂,如果您需要更多帮助,请发表评论。无论如何在互联网上有很多很好的教程。

答案 1 :(得分:1)

C中的指针使用星号声明。指针是一种原始数据类型,它包含一个变量的指针(或地址)。要访问指针指向的数据,我们再次使用星号取消引用指针。

指针可以指向{保持地址} char数组(字符串)的第一个字符,这是您的代码段中的情况。

src++此特定指令使指针指向数组中的下一个字符。

*src这个结构使指针无法访问它指向的角色。

答案 2 :(得分:0)

  • src指针用于提前输入以查找非数字
  • dst指针用于在复制非数字后提前输入
  • 由于结果字符串等于或小于原始字符串,因此最后会添加空终止'\0'
  • input指针是完整的,包含字符串的开头,这是您需要的和返回的内容

这是演练:() - src指针,[] - dst指针:

{[(1)], 2, 'a', 'b', '\0'}
dst == input, src == input

{[1], (2), 'a', 'b', '\0'}
dst == input, src == input + 1

{[1], 2, ('a'), 'b', '\0'}
dst == input, src == input + 2
*dst = *src // copy because *src is not a digit

{'a', [2], 'a', ('b'), '\0'}
dst == input + 1, src == input + 3
*dst = *src // copy because *src is not a digit

{'a', 'b', ['a'], 'b', ('\0')}
dst == input + 2, src == input + 4
*src == false // no more copying, loop ends
dst* = '\0'; // terninating null added

{'a', 'b', ['\0'], 'b', ('\0')}
  ^ - input pointer