当前位置: 首页 > 知识库问答 >
问题:

从istream到char*指针的输入?

郑和泰
2023-03-14

我正在阅读Bjarne Stroustrup的“使用C进行编程原理和实践”(第二版)。在第660-661页,作者定义了一个函数如下:

istream& read_word(istream& is, char* buffer, int max)
    // read at most max-1 characters from is into buffer
{
    is.width(max);    // read at most max-1 characters in the next >>
    is >> buffer;     // read whitespace-terminated word,
                      // add zero after the last character read into buffer
    return is;
}

稍后在int main()中,函数被称为read_word(cin, s, max);其中cinstd::c在中,max是一个ints是一个大小为maxchar数组。

我不明白是怎么回事

C2679二进制'

没有用户定义的运算符

我想知道我们是否可以使用像is这样的东西

更新:我正在使用Visual Studio 2022。我发现代码在C 14/17上运行成功,但在C 20上运行不成功。clang和gcc的结果相似。


共有2个答案

慕志泽
2023-03-14

在c 20中,采用原始字符指针的流运算符已替换为采用固定大小字符数组的流运算符。最简单的解决方案是使用std::string。

要使用数组,您的代码如下所示:

template <size_t N>
istream& read_word(istream& is, char (&buffer)[N], int max)
    // read at most max-1 characters from is into buffer
{
    is.width(max);    // read at most max-1 characters in the next >>
    is >> buffer;     // read whitespace-terminated word,
                      // add zero after the last character read into buffer
    return is;
}

注意,现在最多读取N-1个字符,如果N和max相同,则可以省略max和宽度调用。

池阳伯
2023-03-14

std::basic\u istream::运算符

C 20替换,取字符(

template <size_t N>
std::istream& read_word(std::istream& is, char (&buffer)[N])
{
    is >> buffer;
    return is;
}

然而,正如Alan Birtles在回答中提到的那样,您确实应该远离原始的字符数组,转而使用std::string。

 类似资料:
  • 在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。

  • 本文向大家介绍浅析char 指针变量char *=p 这个语句的输出问题,包括了浅析char 指针变量char *=p 这个语句的输出问题的使用技巧和注意事项,需要的朋友参考一下 学习指针的时候我一直有个疑惑,请看下面的代码: 但是,将int 改成char 类型就不会报错,可以输出字符串。同样是指针,这次为何没有输出地址(理应输出指针代表的地址,但是<<并没有重载地址输出的功能所以报错)呢? 原来

  • C 17(expr.add/4)表示: 当将具有整型的表达式加到指针或从指针中减去时,结果为指针操作数的类型。如果表达式P指向具有n个元素的数组对象x的元素x[i],如果为0,则表达式P J和J P(其中J的值为J)指向(可能是假设的)元素x[i J]≤i j(i j)≤n否则,行为是未定义的。同样,表达式P-J指向(可能是假设的)元素x[i−j] 如果为0≤我−j≤n否则,行为是未定义的。 线标

  • 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为 二级指针,或者 指向指针的指针。 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: 指针变

  • 我有一个函数,它将被传递一个空指针。此指针可以是int、char或float。我知道通过关联值将传递给我的数据类型。例如,下面是我的函数的外观: 如果传递给我的void指针最初是一个char类型,我将它转换回char类型,有没有办法确定与该指针关联的字节数?例如,如果我的函数按如下方式调用: 我将void指针转换回char指针 有没有什么方法可以计算出使用了多少字节?我可能需要搜索空字符并计算它与

  • 我有一个接受字符串的函数。由于 pthread 不接受字符串 ,因此我使函数的参数 char 指针。现在我想用pthread_create调用该函数,但我做不到。问题出现是因为虚空*我认为。我搜索了它并做了一些选角,但我无法成功。我该如何修复它,以便它可以在g下工作 错误是: 线程.cpp: 在函数 “int main()”中: 线程.cpp:27:69: 错误: 从“空 ()(字符)”到“空*