【问题标题】:Looping through an array with pointer notation使用指针符号循环遍历数组
【发布时间】:2016-05-16 05:54:27
【问题描述】:

我正在学习 C++ 中的指针,虽然在这个主题上没有我想的那么清楚,但我正在慢慢实现。

我的目标是编写一个使用指针表示法的函数,遍历一个数组并更改输入的大小写。

例如

("ab7d") myToUpper() -> AB7D

这是我的想法。

void myToUpperCase(const char *source, char *dest)
{
    for (int i = 0; *(source + i) != '\0'; i++)
    {
        *(dest + i) = toupper(* (source + i));
    }
}

结果

("ab7d") myToUpper() -> AB7D\377

有人介意解释将\377 添加到输出中的原因吗,显然我只是在寻找要在此处更改的源,而没有添加到输出中。

谢谢

【问题讨论】:

  • 你没有以空值终止你的输出。
  • @KerrekSB 你介意解释一下吗?我对 C++ 还很陌生。
  • for循环变成do-while循环..
  • 为什么不使用迭代器和更好的......为什么不使用 for_each 和 lambaded toupper?
  • 还要提防潜在的toupper UB。 stackoverflow.com/questions/21805674/…

标签: c++ arrays pointers


【解决方案1】:

字符串是 char 数组,以 '\0' 字节作为终止字符。

您的代码正在复制除最后一个 '\0' 字节之外的任何内容。 因此,如果您更改代码以使用 \0' 字节终止 dest,一切都会好起来的。 (您观察到的 '\377' 恰好是在 dest 中的那个位置出现的字节。)

例如。您可以将代码更改为:

void myToUpperCase(const char *source, char *dest)
{
    for (int i = 0; ; i++)
    {
        if (*(source + i) == '\\0') 
        {
            *(dest + i) = *(source + i);
            break;
        }
        else
        {
            *(dest + i) = toupper(* (source + i));
    }
}

您也可以尝试其他没有任何索引的解决方案 i 基于:

while(*source++ = *dest++) /* empty body */;

(纯粹主义者(有效地)可能会将在循环条件中使用副作用标记为难闻的气味!但它应该给出一个想法......)

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2013-06-09
    • 2023-03-23
    • 2012-10-12
    • 2019-08-13
    • 2013-11-23
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多