【问题标题】:"The Debugger has exited due to signal 10" when writing a char* iteration编写 char* 迭代时,“由于信号 10,调试器已退出”
【发布时间】:2009-03-04 22:22:27
【问题描述】:

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

这是我的代码:

#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);”

谢谢!

标记

【问题讨论】:

标签: c++


【解决方案1】:

你好!

您的“Hello World!” string 就是所谓的字符串字面量,这意味着它的内存是程序的一部分,不能写入。

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

试试这个;

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

同样在你的 for 循环中,你应该使用

【讨论】:

  • 好答案,但为了完整起见,首选 strlcpy()。
  • char hello[] = "Hello World\n" 怎么样
  • 快速评论,但对于不完整的“Hello, World!\n”是不变的,无需检查长度。
【解决方案2】:

正如 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';

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多