【问题标题】:How to traverse char pointer to count the number of types a particular character is there如何遍历 char 指针来计算特定字符的类型数
【发布时间】:2016-05-01 07:45:24
【问题描述】:

例如,如果我有一个普通字符串并且我正在寻找字符串中a 的数量,我会执行以下操作:

char string[] = "HelloThere";
int lengthOfString = strlen(string);
int count = 0;

for(int i=0;i<lengthOfString;i++){
    if(string[i] == 'e'){
        count++;
    }

}

但现在我有一个 char 指针,但我不确定如何正确操作。这是我所做的,但它产生了错误。

char *string;        <------------ Contains "HelloThere"
int lengthOfString = strlen(string);
int count = 0;

for(int i=0;i<lengthOfString;i++){
        if(*string[i] == 'e'){      <-------- I have a feeling this line of mine is wrong.
            count++;
}

有人可以告诉我如何正确地做到这一点吗?

编辑: 另一个简单的问题:如果我有一个字符串指针数组,我想遍历其中一个字符串指针以查找e。这样做的正确语法是什么?

char *string[10];        <------------ Contains "HelloThere"
string[0] = strtok(someBiggerString,"=");
int lengthOfString = strlen(string[0]);
int count = 0;

for(int i=0;i<lengthOfString;i++){
        if(string[i] == 'e'){      <-----------  
            count++;
}

上面箭头线中的语法现在不起作用,因为它会认为我指的是另一个字符串指针。如果我想逐个字符地遍历该字符串,在这种情况下我会怎么做?

【问题讨论】:

  • 您不需要取消引用 string[i] 调用,因此请删除您标记为错误的行中的 *。
  • @JohannesWalcher 但这会遍历字符串吗?我的意思是 string[0] 将是字符串中的第一个字符?
  • *string[i] == 'e' --> *string++ == 'e'string[i] == 'e'
  • 如果你只看发布的代码string 是一个未初始化的指针。如果我们假设string 是一个有效的指针,您可以通过使用if(string[i] == 'e') 而不是if(*string[i] == 'e') 来解决您的问题。

标签: c string pointers


【解决方案1】:

首先,如果它是 char*,您需要确保它指向的字符数组被 \0 字符消除,以使 strlen() 工作..

考虑到它被\0 消除并且lengthOfString 包含正确的长度,您只需要取消引用指针..

语句string[i] 在内部更改为*(string+i)。所以你不需要额外的*

for(int i = 0;i < lengthOfString;i++){
        if(string[i] == 'e'){      
            count++;
}

以上更改的代码足以让您继续前进。


编辑

有点难以理解你想说什么,但如果我没记错的话,你的代码表明要搜索的字符串由存储在string[0] 的指针指向。因为你只使用了strlen()

在这种情况下,您可以使用

for(int i = 0;i < lengthOfString;i++){
        if(*(string[0]+i) == 'e'){      
            count++;
}

或者

for(int i = 0;i < lengthOfString;i++){
        if(string[0][i] == 'e'){      
            count++;
}

【讨论】:

  • 我通过使用 strtok 分解更大的字符串将值放入字符串指针。例如: string = strtok(biggerString,"="); .这是否意味着它仍然以 '\0' 终止并且 strlen 可以工作?
  • @Billy,是的。正如strtok 的手册页所说。 对 strtok() 的每次调用都返回一个指向包含下一个标记的以空字符结尾的字符串的指针。
  • 谢谢。我有一个关于我有类似疑问的最后一个快速问题。我已经编辑了我的问题。请您看一下,看看您是否知道在这种情况下该怎么做。非常感谢。
【解决方案2】:

你的错误存在的地方是完全正确的,它应该是:

if (string[i] == 'e'

*string 指的是数组string 的第一个元素,即string[0]

语句*string[i] == 'e' 反而会导致错误

响应您的编辑:

您现在有一个 char* 数组,因此如果您可以使用 string[0] 访问 char* 中的字符,则要访问 char 指针数组的每个字符,您将需要 string[i][j] 例如步骤像使用二维数组一样遍历每个字符,因为字符指针数组可能被视为char**char [][]

【讨论】:

  • 感谢您的回复。我对这个问题还有一个疑问。我已经更新了我的问题并添加了疑问,你能看看编辑,看看你能不能回答我的疑问?
  • @Billy 请注意,字符串“HelloThere”只会存储在*string[10] 的第一个字符串中,即string[0]
猜你喜欢
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2013-03-22
  • 2022-01-18
  • 2016-11-12
  • 2020-05-29
相关资源
最近更新 更多