0

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

#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;
 }
4

1 回答 1

1

很多误解

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

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

[64]3)当你的意思是整个数组时,你不使用,所以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在最终循环中初始化循环变量,因此它没有可预测的值。你应该初始化i0

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 <string>. 这是您的程序重写为使用 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++ 字符串类型将使您更轻松地编写字符串代码。

于 2020-04-08T05:04:21.983 回答