所以我有一个程序,使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;
}
Run Code Online (Sandbox Code Playgroud)
(这不是作业;))
它构建得很好,但是当我运行它时,我得到一个"调试器因信号10而退出",Xcode指向我:"src [n] = char(ascii + 32);"
谢谢!
标记
Yowsers!
你的"Hello World!" string是所谓的字符串文字,这意味着它的内存是程序的一部分,无法写入.
您正在执行所谓的"就地"转换,例如,而不是将小写版本写入您正在写入原始目标的新缓冲区.因为目的地是一个文字并且无法写入你正在崩溃.
试试这个;
char hello[32];
strcpy(hello, "Hello, World!\n");
Run Code Online (Sandbox Code Playgroud)
同样在你的for循环中,你应该使用<,而不是<=.strlen返回字符串的长度减去其null终止符,并且数组索引从零开始.
正如安德鲁"Hello World\n"在代码中指出的那样,它是一个只读文字.您可以使用strcpy制作可修改的副本,或者尝试这样做:
char hello[] = "Hello, World!\n";
Run Code Online (Sandbox Code Playgroud)
这会自动在堆栈上分配一个数组,该数组足以容纳文字字符串和尾部的副本,并将文字'\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';
}
}
Run Code Online (Sandbox Code Playgroud)
当你在它的时候,为什么要麻烦ascii,只需使用src [n]:
for (int n = 0; n < strlen(src); n++)
{
if (src[n] >= 'A' && src[n] <= 'Z')
{
src[n] -= 'A' - 'a';
}
}
Run Code Online (Sandbox Code Playgroud)
然后,你可以利用这样一个事实,即为了确定一个c字符串的长度,你必须迭代它,然后将它们组合在一起:
for (char *n = src; *n != 0; n++)
if (*n >= 'A' && *n <= 'Z')
*n -= 'A' - 'a';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |