【问题标题】:Error passing C array as char* function parameter将 C 数组作为 char* 函数参数传递时出错
【发布时间】:2011-04-14 09:11:22
【问题描述】:

我正在尝试用 c 语言编写一个简单的代码(愚蠢的问题,但我正在学习),我不明白这段代码给了我一个错误......我一定做错了,我不知道我必须改变...对不起我的英语...在此先感谢大家

#include <stdio.h>
#include <ctype.h>

char* to_up(char* str_); 

int main()
{
    char any_phrase[] = "This is a phrase";
    printf("%s\n", to_up(any_phrase));
    printf("%s\n", to_up("this is another phrase"));
    return 0;
}

char* to_up(char* str_) 
{
    int i;
    for (i=0; str_[i]; i++) 
        str_[i] = toupper(str_[i]);
    return str_;
}

【问题讨论】:

  • toupper() 需要传递一个无符号字符(隐式转换为 int)或 EOF。你应该把它写成toupper((unsigned char)str_[i])。如果您收到“¿Cómo te llamas?”这样的短语,就会出现问题。

标签: c arrays function char


【解决方案1】:

在本次通话中

printf("%s\n", to_up("this is another phrase"));

您正在尝试修改字符串文字。

【讨论】:

    【解决方案2】:

    字符串文字通常在只读内存中。就标准而言,无论它在内存中的什么位置,尝试修改它都会导致未定义的行为。已经有很多个问题被问到这个问题。

    【讨论】:

      【解决方案3】:

      错误的原因是当您将字符串作为“这是另一个短语”单独传递时,如不包含在变量中,该字符串就是所谓的字符串文字。这意味着,除其他外,字符串是恒定的:您根本不允许修改。

      要解决您的问题,您必须将字符串存储在一个变量中,以便您的 to_up() 函数调用可以修改它,因为它会修改字符串的内容。

      【讨论】:

        【解决方案4】:

        代码对我来说编译正常,但在运行时给出了总线错误(核心转储)。

        问题在于字符串文字可以存储在只读内存中,因此您不能像代码那样修改文字字符串。启用足够多的编译器警告后,您的编译器会警告您(GCC 需要 -Wwrite-strings - 至少在 GCC 4.4 及更高版本中)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-23
          • 2010-11-19
          • 2016-07-21
          相关资源
          最近更新 更多