【问题标题】:Looping through the string condition遍历字符串条件
【发布时间】:2015-08-10 01:45:03
【问题描述】:

谁能给我解释一下

  • for 循环条件为 *(str+i)
  • 循环将执行到什么时候
  • count[i++]和count[i]++有什么区别

      void fillCharCounts(char *str, int *count)
      {
        int i;
        for (i = 0; *(str+i);  i++)
        {
          count[*(str+i)]++;
        }
      }
    

【问题讨论】:

  • 添加语言标签。

标签: arrays string for-loop


【解决方案1】:

代码计算str 的每个字母的频率并将其存储到整数数组count。该函数执行后,count[index]的频率为str[index]。让我解释一下你想知道的:

条件为 *(str+i) 的 For 循环:

*(str + i)等于str[i],指的是str的第i个字符。字符指针的值递增以访问下一个索引的地址,然后取消引用该地址以获得指针str现在指向的索引值。

循环将执行到什么时候:

对于每个*(str+i),循环将继续,直到在*(str+i) 找到Null Terminator,即假设以下字符串:

char str[] = "abc";

str 中存储的内容现在是 abc\0,因此循环将一直执行,直到到达 \0。条件*(str+i)基本等于*(str+i) != '\0';

count[i++]和count[i]++有什么区别:

  • count[i++] 等于 *(count + i++) 在使用之前将Post Increment 强加到存储在count 中的address。这意味着一旦执行了语句,(count+i) 的值就会增加 1,并且 count 开始指向下一个索引。
  • count[i]++ 等于*(count + i)++,它将Post Increment 强加到存储在(count + i) 指向的索引中的value。这意味着在执行此语句后,*(count+i) 的值会增加一计数仍指向当前索引。

在你的情况下循环中使用的语句是:

count[*(str+i)]++;

通过应用Order of Precedence

  1. 首先将执行*(str+i),这将给出存储在(str+i)所指向的地址的value
  2. 现在value 将用作计数的index,并且Post Increment 将被强加到count[index],这意味着*(count+index) 的值在执行上述语句后加1。

希望它现在已经很清楚了。

【讨论】:

  • 我几乎明白了,但只是为了总结一下假设我有一个字符串 mom where m=index[0] o=index[1] and m=index[2] count[*(str +i)] 最初将指向字符串的基地址。现在这是我有点混乱的部分。在评估 *(str+i) 之后,它的值是索引还是值m 并在评估后将增加什么。请在我提供的字符串 mom 的上下文中解释我。
  • 对于str = "mom" 让我们访问count[*(str+i)]( ) 将首先被评估,当时 str 是指向"mom" 的第一个索引的指针,因此它持有 m 的地址,对于i = 0str+i 表示str+0,所以结果值再次是m.* 的地址,它会给出存储在str+i 的值,即m 在我们的案子。请记住,[ ] 运算符只接受整数,因此它将尝试将 convert m 转换为整数,这将导致使用 itsASCII 作为 count 的索引。
  • 哦,现在很清楚它会将其转换为我感到困惑的 ASCII 值。感谢您的帮助,感谢 :)
【解决方案2】:

此代码 sn-p 计算在str 中找到的每个字符(不包括终止空字符)的出现次数并将它们存储到count。当函数返回时,count 充当字符到外观数量的映射。例如count['a']是指'a'str中出现的次数。 *(str + i) 等于 str[i],它引用了 C 样式字符串 str 中的 i-th 字符。所以循环一直持续到str 引用的字符串的结尾(即循环到终止空字符'\0',在布尔上下文中计算为false)。 count[*(str+i)]++; 等价于count[str[i]]++;,它将字符str[i] 的计数(出现次数)加一。 count[i++]count[i]++ 的区别与这段代码 sn-p 无关。

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 2018-05-15
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多