char数组和指针C ++

时间:2018-04-16 21:49:22

标签: c++ arrays pointers function-pointers

这是我的计划。 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");

3 个答案:

答案 0 :(得分:0)

当你转换你的数组时,你终止你的循环终止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才会被复制。

答案 1 :(得分:0)

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

YourActivity.this.runOnUiThread(new Runnable(){
 public void run(){
//paste your code here.
});

因此...

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

答案 2 :(得分:-4)

你应该这样做,所以你的函数返回一个指向字符串的指针,并在函数中创建指针dest并返回它,就像这样你有一个情况: 函数的第一次调用结束,dest是&#34; #C ++&#34;,然后再次调用它,只需将#替换为Q