123

我有一个私有类变量char name[10],我想向其中添加.txt扩展名,以便我可以打开目录中存在的文件。

我该怎么做?

最好创建一个保存连接字符串的新字符串变量。

4

8 回答 8

191

首先,不要使用char*or char[N]。使用std::string,然后一切变得如此简单!

例子,

std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!

容易,不是吗?

现在,如果您char const *出于某种原因需要,例如当您想传递给某个函数时,那么您可以这样做:

some_c_api(s.c_str(), s.size()); 

假设这个函数被声明为:

some_c_api(char const *input, size_t length);

std::string从这里开始探索自己:

希望有帮助。

于 2013-03-10T07:15:04.330 回答
36

既然是 C++,为什么不使用std::string代替char*呢?连接将是微不足道的:

std::string str = "abc";
str += "another";
于 2013-03-10T07:15:00.733 回答
19

如果您使用 C 进行编程,那么假设name确实是一个固定长度的数组,就像您说的那样,您必须执行以下操作:

char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...

你现在明白为什么每个人都推荐了std::string吗?

于 2013-03-10T07:29:37.057 回答
8

移植的 C 库中的strcat()函数将为您执行“C 样式字符串”连接。

顺便说一句,即使 C++ 有一堆函数来处理 C 风格的字符串,它可能对你有好处,你可以尝试想出你自己的函数来做到这一点,比如:

char * con(const char * first, const char * second) {
    int l1 = 0, l2 = 0;
    const char * f = first, * l = second;

    // step 1 - find lengths (you can also use strlen)
    while (*f++) ++l1;
    while (*l++) ++l2;

    char *result = new char[l1 + l2];

    // then concatenate
    for (int i = 0; i < l1; i++) result[i] = first[i];
    for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];

    // finally, "cap" result with terminating null char
    result[l1+l2] = '\0';
    return result;
}

...进而...

char s1[] = "file_name";
char *c = con(s1, ".txt");

...其结果是file_name.txt

您可能也想编写自己的operator +,但是不允许仅使用指针作为参数的 IIRC 运算符重载。

另外,不要忘记这种情况下的结果是动态分配的,因此您可能希望对其调用 delete 以避免内存泄漏,或者您可以修改函数以使用堆栈分配的字符数组,当然前提是它有足够的长度。

于 2013-03-10T07:18:43.340 回答
2

C++14

std::string great = "Hello"s + " World"; // concatenation easy!

回答问题:

auto fname = ""s + name + ".txt";
于 2020-05-01T20:35:11.007 回答
0

strcat(destination,source) 可用于在 C++ 中连接两个字符串。

要深入了解,您可以在以下链接中查找 -

http://www.cplusplus.com/reference/cstring/strcat/

于 2017-02-10T17:02:31.613 回答
0

最好使用 C++ 字符串类而不是老式的 C 字符串,生活会容易得多。

如果您有现有的旧式字符串,则可以转换为字符串类

    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string
    string trueString = string (greeting);
    cout << trueString + "and there \n"; // compiles fine
    cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too
于 2017-10-25T12:37:00.703 回答
-2
//String appending
#include <iostream>
using namespace std;

void stringconcat(char *str1, char *str2){
    while (*str1 != '\0'){
        str1++;
    }

    while(*str2 != '\0'){
        *str1 = *str2;
        str1++;
        str2++;
    }
}

int main() {
    char str1[100];
    cin.getline(str1, 100);  
    char str2[100];
    cin.getline(str2, 100);

    stringconcat(str1, str2);

    cout<<str1;
    getchar();
    return 0;
}
于 2015-06-23T19:22:15.500 回答