代码之家  ›  专栏  ›  技术社区  ›  markwatson

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

c++
  •  2
  • markwatson  · 技术社区  · 17 年前

    #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;
    }
    

    (这不是任务;)

    谢谢!

    2 回复  |  直到 17 年前
        1
  •  9
  •   Andrew Grant    17 年前

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

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

        2
  •  7
  •   Salman A    17 年前

    "Hello World\n" strcpy

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

    这会自动在堆栈上分配一个足够大的数组,以容纳文字字符串和尾随字符串的副本 '\0'

    'A'

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

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

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