【问题标题】:Printing the searched line打印搜索到的行
【发布时间】:2019-06-09 00:30:47
【问题描述】:

我想从名字列表中搜索一个名字,如果找到了,我应该返回那个人的全部信息,否则找不到。我不知道为什么我的代码不起作用。我可以打印此人的信息,例如:

输入:

3 史蒂夫 9812761810 017 韦恩 8299915781 102 罗尼 9161462903 120 韦恩

输出:

韦恩 8299915781 102
#include <iostream>
#include <string.h>
using namespace std;

int main() {
  string name[100];
  long long number[100];
  int year[100], i, n, check = 0;
  string inp;
  cin >> n;
  for (i = 0; i < n; i++) {
    cin >> name[i] >> number[i] >> year[i];
  }
  cin >> inp;
  for (i = 0; i < n; i++) {
    if (inp == name[i]) {
      check = 1;
    }
  }
  if (check == 0)
    cout << "Info Not found";
  else
    cout << "The Entered Name is found";
  for (i = 0; i < n; i++) 
    cout << name[i] << number[i] << year[i];
  return 0;
}

【问题讨论】:

  • “不工作”是什么样的?编译器错误?一些意外行为?
  • 你试过调试了吗?

标签: c++ search data-structures


【解决方案1】:

在程序结束时,您将忽略 check 的值,而只打印列表中的所有内容,而不管是否实际找到输入的名称。

试试类似的方法:

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

int main() {
    string name[100];
    long long number[100];
    int year[100], i, n, idx = -1;
    string inp;

    cin >> n;
    for (i = 0; i < n; i++) {
        cin >> name[i] >> number[i] >> year[i];
    }

    cin >> inp;
    for (i = 0; i < n; i++) {
        if (inp == name[i]) {
            idx = i;
            break;
        }
    }

    if (idx == -1)
        cout << "Info Not found";
    else {
        cout << "The Entered Name is found: ";
        cout << name[idx] << " " << number[idx] << " " << year[idx];
    }
    return 0;
}

您也可以考虑使用struct 来更好地组织您的数据,例如:

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

struct myData {
    string name;
    long long number;
    int year;
};

istream& operator>>(istream &is, myData &data) {
    is >> data.name >> data.number >> data.year;
    return is;
}

ostream& operator<<(ostream &os, const myData &data) {
    os << data.name << " " << data.number << " " << data.year;
    return os;
}

int main() {
    myData data[100];
    int i, n, idx = -1;
    string inp;

    cin >> n;
    for (i = 0; i < n; i++) {
        cin >> data[i];
    }

    cin >> inp;
    for (i = 0; i < n; i++) {
        if (inp == data[i].name) {
            idx = i;
            break;
        }
    }

    if (idx == -1)
        cout << "Info Not found";
    else
        cout << "The Entered Name is found: " << data[idx];

    return 0;
}

【讨论】:

    【解决方案2】:

    从输入流中读取一个整数后,您应该在从输入流中读取任何字符串之前使用cin.ignore();

    cin.ignore(); 忽略“换行”字符。

    您修改后的代码:

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int main() {
      string name[100];
      long long number[100];
      int year[100], i, n, check = 0;
      string inp;
      cin >> n;
      cin.ignore();
      for (i = 0; i < n; i++) {
        cin >> name[i] >> number[i] >> year[i];
        cin.ignore();
      }
      cin >> inp;
      for (i = 0; i < n; i++) {
        if (inp == name[i]) {
          check = 1;
        }
      }
      if (check == 0)
        cout << "Info Not found";
      else
        cout << "The Entered Name is found";
      for (i = 0; i < n; i++) 
        cout << name[i] << number[i] << year[i];
      return 0;
    }
    

    在此处阅读更多信息:Using getline(cin, s) after cin

    【讨论】:

    • operator&gt;&gt; 忽略前导空格包括换行符,除非使用了std::noskipws。如果 OP 以任何其他方式读取值,例如 std::getline()std::cin.get() 等,您所说的将是正确的,但由于 OP 代码中的所有读取都是仅使用 operator&gt;&gt; 完成的,因此不应调用 cin.ignore()事情。此外,您的代码与 OP 的代码在写出错误输出时犯的错误相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2013-03-21
    • 2015-04-17
    • 2017-04-18
    相关资源
    最近更新 更多