【问题标题】:C toLowerCase Function won't work - Access violationC toLowerCase 函数不起作用 - 访问冲突
【发布时间】:2011-02-07 22:37:44
【问题描述】:

我有一个简单的函数,它将一个字符数组作为参数,并将所有字符转换为小写。但是,我收到一个奇怪的访问冲突错误。代码如下:

void toLower(char *rec)
{
 int i=0;
 while (rec[i]!='\0')
 {
  if (rec[i]>='A' && rec[i]<='Z') 
               rec[i]='a'+rec[i]-'A';  //this is where I get an error - assigning the
                                       //the value to rec[i] is the problem
  i++;
 }
}

你能告诉我我的错误是什么吗? 谢谢

【问题讨论】:

  • 如果这不是家庭作业,有一个 C++ 标准库函数,std::tolower in &lt;cctype&gt; 就是这样做的。
  • @James McNellis:但 tolower 仅适用于单个角色。
  • 这是字符数组还是字符串?如果这是数组,则需要数组长度作为附加参数。
  • 不,这不是作业,我只是在练习我的 C++,它有点生锈了...... :) @Kenny:我用这个:toLower(rec);其中 rec 也传递给我调用 toLower 的函数,如下所示: int palindrome(char *rec) { ... @Alex: 这是一个数组,但最后我有一个空终止字符串,所以它不是问题。顺便说一句,该函数在第一次迭代中崩溃。

标签: c access-violation lowercase


【解决方案1】:

在评论中您说您将文字字符串传递给函数,如下所示:

palindrome("In girum imus nocte et consumimur igni")

palindrome 将其参数传递给toLower。这不起作用,因为字符串文字是只读的并且您正在尝试修改它。相反,您可以使用:

char str[] = "In girum imus nocte et consumimur igni";
palindrome(str);

或者您可以让palindrome 将其参数复制到一个数组中,然后调用toLower

【讨论】:

  • 谢谢!解决了!然而,在尝试之前 char str[] = "In girum imus nocte et consummur igni";我试过 char *str = "In girum imus nocte et consumimur igni";它没有用。为什么?有什么区别?
  • char *str ="..." 是一个指针,接收只读字符串字面量的地址,不能修改。 char str[]="..."是一个数组,所以可以修改。
  • 太棒了!非常感谢您的宝贵时间!
【解决方案2】:

你工作太辛苦了:)

#include <algorithm> //For std::transform
#include <cctype> //For std::tolower
#include <cstring> //For std::strlen

void toLower(char *rec)
{
    std::transform(rec, rec + std::strlen(rec), rec, std::tolower);
}

【讨论】:

  • 是的,但不能解决这里的问题(这可能是传入的错误参数)。
  • @interjay:是的,但如果他这样做,他可以消除这个问题的可能原因。标准库函数不会出错。
  • 谢谢,但重点是我想锻炼一下我的 C :)
  • @misaizdaleka:那么你应该标记你的问题 C,而不是 C++。
  • @misaizdaleka 通过做一些新颖的事情来锻炼你的 C 技能 :) 为什么要重新发明轮子?
【解决方案3】:

您是否正在(甚至间接地)传递字符串文字?如果是这样,那么它可能会被加载到不可写的内存中;您需要对副本进行更改。

您的函数原型采用 char * 而不是 const char * 表明您可能没有这样做,但我想我会扔掉它。

【讨论】:

  • 好的,在主程序中我这样做: printf ("%d \n", palindrome("In girum imus nocte et consummur igni"));然后,回文(char *rec)调用toLower(char *rec),传递我首先传递的字符串。
  • 看起来这是个问题——试图修改字符串文字。
【解决方案4】:

听起来您没有传入有效的缓冲区。但是不要自己写这个;使用strlwr之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多