因此,我试图编写一个接受字符串并将所有小写值更改为大写的函数。这是代码:
void lowerToUpper(char *s)
{
char *p;
for (p = s; *p; p++)
{
if (islower(*p))
*p = toupper(*p);
}
}
int main (int argc, char * argv[])
{
char *pa;
pa = "This is a test.";
printf("The following string will be edited:\n");
printf("%s\n%s\n%s\n", pa);
lowerToUpper(pa);
printf("The string has been edited, and is now as follows:\n");
printf("%s\n%s\n%s", pa);
return EXIT_SUCCESS;
}
问题来自于" * p = toupper(* p);",这是我得到分段错误的地方。我的猜测是,问题出现在尝试分配toupper(* p)返回* p的值。在做了一些测试后,似乎toupper(* p)工作,但是一旦我尝试将值赋给* p,我就会出错? 关于为什么会发生这种情况的任何想法?
答案 0 :(得分:7)
pa = "This is a test.";
在上面的行中,您将指针pa设置为指向只读字符串。当您的函数写入该内存时,您正在调用未定义的行为。 (如果使用-Wall标志编译程序,则会收到警告,告诉您有关该问题的信息)
获取可写char数组的正确方法是:
char pa[] = "This is a test.";
此外,您对printf()的调用指定了四个%s标记,但您只提供一个字符串指针参数。您需要删除三个%s标记,或者在pa。
之后添加其他字符串指针参数答案 1 :(得分:0)
变化:
pa = "This is a test.";
到:
pa = strdup("This is a test.");
更改:
printf("%s\n%s\n%s\n", pa);
要:
printf("%s\n", pa);
而且,也许'免费(pa)'应该在“返回”之前调用。言。