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