【问题标题】:char array and pointer C++char 数组和指针 C++
【发布时间】:2018-09-26 18:02:05
【问题描述】:

这是我的程序。 char s3[2] = "q" 的输出是 "QC++",而它应该只是 "Q"。我想我必须重置指针,但我不确定如何。

void myToUpperCase(const char *source, char *dest){

    for(int i = 0; *(source + i) != '\0'; i++)
    {
        *(dest + i) = toupper(*(source + i));
    }
}

char s2[20] = "#c++";
char s3[2] = "q";
char result[20];

myToUpperCase(s2, result);
cout << "- s2 (\"" << s2 << "\") myToUpper() -> " << result << " => "     << ((strcmp(result, "#C++") == 0) ? "correct.\n" : "INCORRECT.\n");

myToUpperCase(s3, result);
cout << "- s3 (\"" << s3 << "\") myToUpper() -> " << result << " => "     << ((strcmp(result, "Q") == 0) ? "correct.\n" : "INCORRECT.\n");

【问题讨论】:

标签: c++ arrays pointers function-pointers


【解决方案1】:

您可以在调用 myToUpperCase 之前调用 memset 来准备缓冲区。这通常很有帮助。

void * memset ( void * ptr, int value, size_t num );

所以...

memset(result, 0, 20);

【讨论】:

  • memset 太过分了。您只需将一个字符设置为 null 即可终止字符串。
  • 是的,但是在进入的途中有一个充满垃圾的缓冲区不一定是好的做法。这对n00bs绝对没有帮助。
【解决方案2】:

当你转换你的数组时,你会在终止没有被复制的 null 处终止循环,因此当你打印转换后的字符串时,它会继续打印内存的内容,直到它遇到第一个随机 0。这就是你得到垃圾的原因。试试这个改变:

#include <iostream>
#include <cctype>
#include <cstring>

void myToUpperCase(const char *source, char *dest)
{
    while ((*dest++ = std::toupper(static_cast<unsigned char>(*source++))) != '\0');
}

int main()
{ 
    char s2[20] = "#c++";
    char s3[2] = "q";
    char result[20];

    myToUpperCase(s2, result);
    std::cout << "- s2 (\"" << s2 << "\") myToUpper() -> " << result << " => " << ((std::strcmp(result, "#C++") == 0) ? "correct.\n" : "INCORRECT.\n");

    myToUpperCase(s3, result);
    std::cout << "- s3 (\"" << s3 << "\") myToUpper() -> " << result << " => " << ((std::strcmp(result, "Q") == 0) ? "correct.\n" : "INCORRECT.\n");
}

https://ideone.com/lj1HC5

- s2 ("#c++") myToUpper() -> #C++ => correct.
- s3 ("q") myToUpper() -> Q => correct.

while 循环在到达 '\0' 时终止,只是这一次终止 null 已被复制。

【讨论】:

    【解决方案3】:

    你应该让你的函数返回一个指向字符串的指针,并在函数中创建指针 dest 并返回它,像这样你有一个情况: 函数的第一次调用完成,dest 是“#C++”,然后再次调用它,只是用 Q 替换 #

    【讨论】:

    • 问题是为什么字符串格式错误,这是因为输出字符串中没有终止 null 并且因为两个输出字符串使用相同的缓冲区。巧合的是,该缓冲区中有一个终止空值以在 4 个字符后停止输出。您的回答并没有修复他的代码中的错误并增加了额外的复杂性。在函数中分配内存并期望调用者释放它是危险的。如果这很重要,它也会损害性能。
    猜你喜欢
    • 2021-01-26
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多