3

下面的代码用于将字符串中的连续重复字符替换为仅出现一次

e.g. "AAAABBBB" -> "AB" 

当我退出 for 循环并在 temp 中打印值时,我的期望是获取字符串单词的最后一个字母。但是,我得到了字符串的第一个字母(即,使用我初始化 temp 的值)。

string processString(string word) {
  char temp = word[0];
  string result = "";
  int size = word.size();
  for(int i=0, temp=word[0]; i<size; i++) {
    if(word[i] == temp) {
      continue;
    } else {
      result += temp;
      temp = word[i];
    }
  }
  cout << "TEMP : " << temp << endl;
  return result + temp;
}

结果:

WORD: CJXEJACCAJEXJF
TEMP: C
Output of function: CJXEJACAJEXJC

但是,如果我删除 for 循环中的重新初始化,上面的代码工作得很好:

string processString(string word) {
  char temp = word[0];
  string result = "";
  int size = word.size();
  for(int i=0; i<size; i++) {
    if(word[i] == temp) {
      continue;
    } else {
      result += temp;
      temp = word[i];
    }
  }
  cout << "TEMP : " << temp << endl;
  return result + temp;
}

结果:

WORD: CJXEJACCAJEXJF
TEMP: F
Output of function: CJXEJACAJEXJF

任何线索为什么会这样?为什么在 FOR 循环中重新初始化它会产生如此大的差异?

4

4 回答 4

2

for循环中,您没有重新初始化temp. 您正在创建一个名为阴影外部的全新int变量:temptemp

for(int i=0,temp=word[0];i<size;i++){
            ^^^^ brand new `temp'

一些编译器可以配置为对此发出警告:

$ g++ -Wshadow test.cpp
test.cpp: In function 'std::string processString(std::string)':
test.cpp:10:15: warning: declaration of 'temp' shadows a previous local [-Wshadow]
test.cpp:7:8: warning: shadowed declaration is here [-Wshadow]
于 2012-12-12T15:47:51.493 回答
2

关于阴影的其他答案是正确的,但仅供参考,您的函数可以简单地写成:

#include <string>
#include <iterator>
#include <algorithm>

std::string unique(std::string const &source)
{
    std::string result;

    std::unique_copy(src.begin(), src.end(),
                     std::back_inserter(result));
    return result;
}
于 2012-12-12T16:02:43.107 回答
1
for(int i=0,temp=word[0];i<size;i++)

这声明了两个变量,itemp,范围for语句内。这temp隐藏了声明之外的for声明。

于 2012-12-12T15:47:43.647 回答
1

一个名为的新变量在循环temp中声明为 an :intfor

for(int i=0,temp=word[0];i<size;i++){

隐藏外部char temp变量,这意味着该char temp变量永远不会在for. 循环的第二个版本for没有temp通过省略初始化来声明新变量。

于 2012-12-12T15:47:44.677 回答