INT在FOR循环外保持不变

时间:2017-12-06 18:48:40

标签: c++ string for-loop if-statement boolean

功能“f_vowels”有效;它打印两个字符串所具有的常见元音的数量。另一个,“two_c”也应该起作用;如果两个字符串在同一位置共享至少两个公共字母,则为true。我的问题是第三个,因为它应该打印这些字母,但总是打印消息“字符串没有2个常用字母”。我想我知道为什么:我用FOR循环增加“暗淡”,但布尔函数仍然使用原始的“暗淡”。我该如何解决这个问题?

#include <iostream>
#include <string.h>
using namespace std;

// functions' calls

void f_vowels(string, string);
bool two_c(int);
void print_2c(string, string, int, int);

// main
int main(){
string s1, s2;
int i, j, vowels;
int l1, l2;
char vow, c1, c2;

cout << "Enter your string: ";
getline(cin, s1);
cout << "\n";

cout << "Enter your string: ";
getline(cin, s2);
cout << "\n";

f_vowels(s1, s2);

int dim=0;
char common[dim];

for (int i=0; i<l1 && i<l2; i++){
    if (s1[i]==s2[i])
    {
    common[dim++];
    }
}

two_c(dim);

if (two_c(dim)==true){
print_2c(s1, s2, l1, l2);
} 

else cout << "Strings don't have 2 common letters.";

}

//functions

//common vowels

void f_vowels(string s1, string s2){

int l1=s1.length();
char c1[l1];
s1.copy(c1, l1);

int l2=s2.length();
char c2[l2];
s2.copy(c2, l2);

int vowels=0;
char vow[]={'a','e','i','o','u','A','E','I','O','U'};

for (int i=0; i<10; i++){
    for (int j=0; j<l1 && j<l2; j++){
    if (c1[j]=vow[i] && c2[j]==vow[i]){
        vowels++;
        }
      }
    }
    cout << vowels << "\n\n";    
    }

 // true if strings have at least 2 common letters in the same position

bool two_c(int dim){

if (dim<2){
return false;
}
else return true;

}

// print boolean function

void print_2c(string s1, string s2, int l1, int l2){

int dim=0;
char common[dim];

    for (int i=0; i<l1 && i<l2; i++){
        for (int j=0; j<l1 && j<l2; j++){
            if (s1[i]==s2[i])
            common[j]=s1[i];
            cout << common[j] << "is a common letter. \n";      
            }
      }
}

2 个答案:

答案 0 :(得分:1)

这里有几个问题。

这个逻辑:

int dim=0;
char common[dim];

for (int i=0; i<l1 && i<l2; i++){
    if (s1[i]==s2[i])
    {
    common[dim++];
    }
}

......什么都不做。 common [dim ++]执行查找并抛出该值,因为它没有被赋值给任何东西。您正在尝试的是确定数组大小暗淡或至少根据预期匹配的数量增加它的大小。要做到这一点,你必须先声明昏暗,然后再声明你是阵列。所以:

int dim=0;

for (int i=0; i<l1 && i<l2; i++){
    if (s1[i]==s2[i])
    {
    dim++;
    }
}

char common[dim]; //won’t compile

这种方法不会编译,因为编译器在程序运行之前无法知道dim的大小。如果你仍然认为数组是这样做的话,你需要使用'new'动态分配数组(考虑std :: vector)。

int dim=0;

for (int i=0; i<l1 && i<l2; i++){
    if (s1[i]==s2[i])
    {
    dim++;
    }
}

char* common = new char[dim];

ALSO:

关于

void print_2c(string s1, string s2, int l1, int l2){

 int dim=0;
char common[dim]; //a local array, not what you e setup

for (int i=0; i<l1 && i<l2; i++){
    for (int j=0; j<l1 && j<l2; j++){
        if (s1[i]==s2[i])
        common[j]=s1[i];
        cout << common[j] << "is a common letter. \n";      
        }
  }
}

这里运行的逻辑是在一个名为common的本地空数组上执行的,不同于你在此调用之前创建的公共数组。看来你想要访问你的数组。您需要以某种形式传递(可能作为参数),然后您将能够使用您设置的内容。所以:

void print_2c(string s1, string s2, int l1, int l2, char* common, const int dim){


for (int i=0; i<l1 && i<l2; i++){
    for (int j=0; j<l1 && j<l2; j++){
        if (s1[i]==s2[i])
        common[j]=s1[i];
        cout << common[j] << "is a common letter. \n";      
        }
  }
}

并称为:

print_2c(s1,s2,l1,l2,common,dim);

最后: 这个逻辑:

for (int i=0; i<l1 && i<l2; i++){
    for (int j=0; j<l1 && j<l2; j++){
        if (s1[i]==s2[i])
        common[j]=s1[i];
        cout << common[j] << "is a common letter. \n";      
        }
  }

可能没有做你想做的事。在内部循环中,当s1中的char与s2匹配时,所有共同的最小值(l1,l2)都设置为该char,并且它将仅重复打印出该char的“常用字母”。 Common将保持填充所有条目是相同的char,直到下一个匹配时所有值都被覆盖并设置为新的char值。不是你想要的。

如果常见的是bool数组,并且每个索引代表一个符合条件的匹配字符(即元音),您可以执行以下操作:

for (int i=0; i<l1 && i<l2; i++){
    //no inner loop needed
        if (s1[i]==s2[i])
        common[s1[i]]=true;
        cout << s1[i] << "is a common letter. \n";      
        }
  }

答案 1 :(得分:0)

您正在创建一个大小为0的char数组。

"relations": {
    "products": {
      "type": "hasMany",
      "model": "product",
      "foreignKey": "comp_id"
    }
  },

改变昏暗的适当长度(s1或s2长度),我认为你会解决你的问题