2009-03-04 59 views
2

所以我有一个程序使char *的东西小写。它通过遍历和操作ascii来完成。现在我知道在C++中可能有一些这样的库,但那不是重点 - 我是一个试图掌握char * s和东西的学生:)。编写char *迭代时,“Debugger已经退出,因为信号10”

这里是我的代码:

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

谢谢!

马克

+0

n的值是多少? – 2009-03-04 22:27:29

+0

另外,转换为int并返回的思想过程是什么?上次我检查,char在C++中是一个数字类型。 – 2009-03-04 22:30:08

回答

9

Yowsers!

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

您正在执行所谓的“就地”转换,例如,而不是写出小写的版本到您正在写入原始目的地的新缓冲区。由于目的地是文字,无法写入您正在崩溃。

试试这个;

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

另外在你的循环,你应该使用<,不< =。 strlen返回一个字符串的长度减去它的空终止符,并且数组索引是从零开始的。

7

正如Andrew在代码中指出"Hello World\n"是只读文字。您可以使用strcpy做出修改副本,要不试试这个:

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

这会自动分配堆栈大到足以容纳文字字符串的副本上一个阵列尾随'\0',并复制文字进入阵列。

此外,您还可以一走了之ASCII作为一个字符,并使用字符文字而不是中知道的'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';