在编写char *迭代时,“调试器因信号10而退出”

时间:2009-03-04 22:22:28

标签: c++

所以我有一个程序使char *的东西小写。它通过迭代和操纵ascii来实现。现在我知道在c ++中可能有一些这样的库,但这不是重点 - 我是学生试图掌握char *和东西:)。

这是我的代码:

#include <iostream>

using namespace std;

char* tolower(char* src);

int main (int argc, char * const argv[])
{
    char* hello = "Hello, World!\n";

    cout << tolower(hello);
    return 0;
}

char* tolower(char* src)
{
    int ascii;
    for (int n = 0; n <= strlen(src); n++)
    {
        ascii = int(src[n]);
        if (ascii >= 65 && ascii <= 90)
        {
            src[n] = char(ascii+32);
        }
    }

    return src;
}

(这不是作业;))

它构建得很好,但是当我运行它时,我得到一个“调试器因信号10而退出”并且Xcode指向我的行:“src [n] = char(ascii + 32);”

谢谢!

标记

2 个答案:

答案 0 :(得分:9)

Yowsers!

你的“Hello World!” string是所谓的字符串文字,这意味着它的内存是程序的一部分,无法写入。

您正在执行所谓的“就地”转换,例如而不是将小写版本写入您正在写入原始目标的新缓冲区。因为目的地是一个文字并且无法写入你,所以会发生崩溃。

试试这个;

char hello[32];
strcpy(hello, "Hello, World!\n");

同样在你的for循环中,你应该使用&lt ;, not&lt; =。 strlen返回字符串的长度减去其null终止符,并且数组索引从零开始。

答案 1 :(得分:7)

正如Andrew所说,代码中的"Hello World\n"是一个只读文字。您可以使用strcpy制作可修改的副本,或者尝试以下操作:

char hello[] = "Hello, World!\n";

这会自动在堆栈上分配一个数组,该数组足以容纳文字字符串和尾随'\0'的副本,并将文字复制到数组中。

此外,您可以将ascii保留为char,并使用字符文字而不必知道'A'的数值是什么:

char ascii;
for (int n = 0; n < strlen(src); n++)
{
    ascii = src[n];
    if (ascii >= 'A' && ascii <= 'Z')
    {
        src[n] = ascii - 'A' + 'a';
    }
}

当你在它的时候,为什么要打扰ascii,只需使用src [n]:

for (int n = 0; n < strlen(src); n++)
{
    if (src[n] >= 'A' && src[n] <= 'Z')
    {
        src[n] -= 'A' - 'a';
    }
}

然后,你可以利用这样一个事实,即为了确定一个c字符串的长度,无论如何你必须迭代它,然后将它们组合在一起:

for (char *n = src; *n != 0; n++)
    if (*n >= 'A' && *n <= 'Z')
        *n -= 'A' - 'a';