【问题标题】:Returning and Printing Strings in C++在 C++ 中返回和打印字符串
【发布时间】:2020-07-20 10:27:45
【问题描述】:

我试图在 getPath() 函数中从用户那里获取文件路径,并将路径作为字符串返回。我遇到了麻烦,因为编译器说我需要使用 const char 而我不知道该怎么做。我将如何使用 const chars 以及它们是什么。另外我如何像在主函数中一样将它们打印到控制台。

#include <iostream>
#include <stdio.h>
#include <string.h>

  char getPath() {
     char path[64];
     std::cout << "Input File Name For Debugging:";
     gets(path);
     std::cout << "Debugging: ";
     puts(path);
     return path[64];
 }

int main(){
    char path[64];
    int pathlen = strlen(reinterpret_cast<const char *>(path));
    //suppost to print the char array
    for(int i; i < pathlen; i++){
        std::cout << path[i];
    }
     return 0;
 }

【问题讨论】:

  • 旁白:getPath 没有正确设计,也没有被调用。您的代码中的许多内容都未初始化。
  • 你在哪里学习这些?您的代码是带有std::cout 的C,而不是C++。此外,gets 是邪恶的。它在 C++11 中已弃用并在 C++14 中删除。您正在学习“C with classes”,这不是正确的 C++。
  • 我知道这些函数是不受保护的,很容易溢出。我正在使用它来学习二进制利用。我从 cplusplus.com 获得了大部分内容,如果有更好的网站,请告诉我。
  • 我并不是要冒犯你,但在尝试学习二进制利用之前,你应该真正掌握编程。您知道gets 的问题,所以除非您尝试编写易受攻击的程序,否则不要使用它。从网站上学习基本的 C++ 通常不会有好的结果,所以你应该得到一个 good book 来代替。

标签: c++ string printing char const-char


【解决方案1】:

很多误解

1) char 不是字符串,是字符

2) 字符数组(例如char [64])不是字符串,而是数组。它可以容纳一个字符串,但这是一个微妙的不同的想法

3) 当你的意思是整个数组时,你不要使用[64],所以return path[64]; 不是返回字符串的正确方法。

4) 不要将 C++ I/O (std::cin, std::cout) 与 CI/O (puts, gets) 混合使用,它不能可靠地工作,坚持使用 C++ I/O 所以

 std::cout << "Debugging: " << path << '\n';

不是

 std::cout << "Debugging: ";
 puts(path);

5) 你永远不会调用你的 getPath 函数,所以它当然不会执行

6) 您没有在最终循环中初始化循环变量i,因此它没有可预测的值。您应该将i 初始化为0

for(int i; i < pathlen; i++){
     std::cout << path[i];

应该是

for(int i = 0; i < pathlen; i++){
     std::cout << path[i];

你可以看到一个非常短的程序有很多错误。我将展示两种不同的正确方法来编写这个程序。

所以在 C++ 中表示字符串有两种方式,一种是 C++ 方式,另一种是 C++ 从 C 继承。您在上面编写的代码试图以 C 方式做事,所以我将展示首先,但实际上 C++ 方式要容易得多。我将展示第二个,但这是你应该做事的方式。

第一种方法是使用一个字符数组来保存字符串。但是数组在 C++ 中有严重的问题。特别是不可能从函数中返回数组,因此即使您解决了所有较小的问题,上面的代码也永远无法工作。你让 C++ '返回' 一个数组的方式有点奇怪,我不会正确解释它(你需要阅读一本好的 C++ 书)。您所做的是在调用函数中声明数组并将数组作为参数传递。这是您使用这种技术编写的程序(并修复了所有其他问题)。

#include <iostream>

void getPath(char path[], int n) {
     std::cout << "Input File Name For Debugging:";
     std::cin.getline(path, n);
     std::cout << "Debugging: " << path << '\n';
}

int main(){
    char path[64];
    getPath(path, 64);
    std::cout << path << '\n';
    return 0;
}

注意我使用getline 来读取字符串,这是一种读取字符串的C++ 方式。 getline 要求您传递要读取的数组的大小,所以我将它传递给 getPath 以及数组本身。

现在是简单的方法。 C++ 有它自己的字符串类型,称为std::string。您根本不需要使用棘手的数组。并且可以以正常方式从函数返回 C++ 字符串类型。这使得代码更加自然。要使用 C++ 字符串类型,您只需 #include &lt;string&gt;。这是你的程序重写为使用 C++ 字符串类型

#include <iostream>
#include <string>

std::string getPath() {
     std::cout << "Input File Name For Debugging:";
     std::string path;
     std::getline(std::cin, path);
     std::cout << "Debugging: " << path << '\n';
     return path;
}

int main(){
    std::string path;
    path = getPath();
    std::cout << path << '\n';
    return 0;
}

请注意,第二个程序更接近您的原始代码,getPath 有一个返回类型,只是它是 std::string 而不是 char,它有一个 return 语句来返回路径。这是您应该编写此代码的方式,C++ 字符串类型将使您更轻松地编写字符串代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2019-08-24
    相关资源
    最近更新 更多