【问题标题】:What am i doing wrong in string.h function usage?我在 string.h 函数使用中做错了什么?
【发布时间】:2020-03-04 15:00:59
【问题描述】:

当我尝试编译以下代码时,我得到了错误

strupr.cpp:在函数“int main()”中:strupr.cpp:9:10:错误:“strupr” 未在此范围内声明 cout

#include<iostream>
#include<cstring>

using namespace std;

int main(void){
    cout << strupr("hello world") << endl;
}

【问题讨论】:

  • 请在问题中包含代码,不要作为链接,尤其不要作为图片。
  • c-String 函数位于 cstring 标头而不是 string.h。此外,stdupr 不是标准函数,可能不包含在您的 libc 中。请改用std::transformstd::toupper
  • int main(void){ 不是有效的 C++ 代码。
  • 这是namespace 而不是namesapce
  • strupr 将其参数转换为大写。 strupr("hello world"); 尝试将文字字符串转换为大写;您不允许修改文字字符串,因此这不起作用。 char str[] = "hello world"; strupr(str); 可以,因为str 不是文字,可以修改。

标签: c++


【解决方案1】:

在 C++ 中你想做这样的事情:

#include<iostream>
#include<string>
#include <algorithm>
#include <cctype>

int main(){
    std::string s = "hello world";
    std::transform(s.begin(), s.end(), s.begin(), ::toupper);
    std::cout << s << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    首先,strupr 既不是标准 C 库的一部分,也不是标准 C++ 库的一部分。因此,不需要声明它的标准标头。

    也就是说,它最初是微软的事情,并且确实在&lt;string.h&gt; 中声明。更多讨论请见this question

    因此,除非您的编译器将其作为扩展,否则它将不存在。这就是错误消息告诉您的内容。

    即使它确实存在,您也不能像问题中的代码尝试那样使用它。问题是它修改了其参数的内容,因此您不能将const char* 传递给它。这就是这段代码的作用:

    strupr("hello world");
    

    "hello world" 是一个字符串文字,在过去它的类型是char[12],也就是说,从形式上看,它看起来像一个可修改的字符串。但实际上,由编译器决定字符串文字是否可修改,因此对于某些编译器来说可以,而对于其他编译器则不行。如果不是,那是因为编译器将字符串文字放在只读内存中,因此尝试修改文字会产生运行时错误。

    在C++中,"hello world"的类型是const char[12],即字符串中的字符是不可修改的。所以调用strupr("hello world") 是错误的,编译器应该发出诊断。

    为了让它工作,如果你的编译器提供了这个函数,你必须在一个可修改的字符串上调用它:

    char str[] = "hello world";
    strupr(str);
    

    strchar 的可修改数组,它在其初始化程序中保存文本的副本,在本例中为"hello world"。该字符串可以修改,所以strupr 可以完成它的工作。

    【讨论】:

      【解决方案3】:

      由于strupr()是一个字符串操作函数,很自然会误认为它属于string.h头文件。但是,它实际上是在 cstring 头文件中定义的,用于将字符串中的所有字符转换为大写字母,即存储在 c 风格的 char 数组中的字符串。

      尝试包含 cstring.h,它应该可以正常运行。如果您进一步收到错误,请同时包含错误,因为我们可以更好地了解可能出现的问题。

      【讨论】:

      • strupr 既不是标准 C 也不是标准 C++,因此两种语言都没有指定声明它的标头。而cstring.h 不是标准标头。
      • 一般来说,在 C 的 &lt;xxxx.h&gt; 头文件中声明的名称也在 C++ 中相应的 &lt;cxxxx&gt; 头文件中声明。据我所知,&lt;cxxxx&gt; 标头中声明的函数没有在 &lt;xxxx.h&gt; 标头中没有对应项。毕竟,它们存在的原因是为了提供对标准 C 库的访问。在少数情况下,C++ 中更改了 签名 以提高 const 正确性,这有时意味着提供具有不同 const 限定符的重载,但名称仍然相同。
      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2011-04-15
      • 1970-01-01
      • 2019-11-13
      • 2018-12-31
      • 1970-01-01
      相关资源
      最近更新 更多