字符数组和指针C++

char array and pointer C++

本文关键字:C++ 指针 数组 字符      更新时间:2023-10-16

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

void myToUpperCase(const char *source, char *dest){
    for(int i = 0; *(source + i) != ''; 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");

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

#include <iostream>
#include <cctype>
#include <cstring>
void myToUpperCase(const char *source, char *dest)
{
    while ((*dest++ = std::toupper(static_cast<unsigned char>(*source++))) != '');
}
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 已被复制。

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

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

所以。。。

memset(result, 0, 20);

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