鱼C论坛

 找回密码
 立即注册
查看: 714|回复: 12

[已解决]关于 cin 一个 char*

[复制链接]
发表于 2024-5-17 16:12:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjinxuan 于 2024-5-17 16:28 编辑
#include <bits/stdc++.h>
using namespace std;

char s[100005];

signed main() {
        cin >> (s + 1);
        return 0;
}

C++20 及以后则无法正常编译,求解决方案。

s+1 和 s 有本质区别吗……为什么不 +1 就可以编译……

会不会学了个假的 C++ 语言

最佳答案
2024-5-17 17:34:33
https://zh.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2

c++20之前有个这
 template< class Traits >
basic_istream<char, Traits>&
    operator>>( basic_istream<char, Traits>& st, signed char* s );

c++20开始变成了这样
 template< class Traits, std::size_t N >
basic_istream<char, Traits>&
    operator>>( basic_istream<char, Traits>& st, signed char (&s)[N] );

那么,你现在知道为什么cin >> s;可以,cin >> (s + 1);不行了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-17 16:14:06 | 显示全部楼层
问题出在 `(s + 1)` 这个地方,这是因为 `cin` 函数无法直接读取一个字符指针。正确的做法是使用 `cin` 读取一个字符数组,然后再将其传递给字符指针。

下面是一个示例代码:
#include <iostream>
using namespace std;

int main() {
    char s[100];
    cin >> s;
    
    // 将字符数组转为字符指针
    char* p = s;
    
    // 打印结果
    cout << p << endl;
    
    return 0;
}

在这个例子中,我们先定义一个足够大的字符数组 `s`,然后使用 `cin` 直接读取用户输入的字符串。然后,我们将字符数组 `s` 赋值给字符指针 `p`,这样就可以使用 `p` 指向 `s` 的内容。

注意:请确保输入的字符串不会超过字符数组 `s` 的大小。此外,要避免使用未初始化的字符指针,以防止发生未定义的行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-17 16:15:12 | 显示全部楼层
FishC 发表于 2024-5-17 16:14
问题出在 `(s + 1)` 这个地方,这是因为 `cin` 函数无法直接读取一个字符指针。正确的做法是使用 `cin` 读 ...

请解释为什么这个代码可以正常在 C++20 环境下编译:
#include <bits/stdc++.h>
using namespace std;

char s[100005];

signed main() {
        cin >> (s);
        return 0;
}

(s) 和 (s+1) 有本质区别吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 16:16:30 | 显示全部楼层
zhangjinxuan 发表于 2024-05-17 16:15
请解释为什么这个代码可以正常在 C++20 环境下编译:
...


在 C++ 中, `(s)` 和 `(s+1)` 实际上并没有本质的区别。两种写法都是将 `s` 作为一个表达式来处理。

然而,C++ 的编译器对这两种写法的解释是不同的。当你使用 `(s)` 时,它会被解释为表达式 `s`,即一个字符变量。而当你使用 `(s+1)` 时,它会被解释为表达式 `s+1`,其中的 `+` 是一个二元运算符,表示对 `s` 进行加法运算。由于 `s` 是一个字符变量,它会被隐式地转换为整型值,然后进行加法运算。

所以,`(s)` 是一个合法的表达式,可以用作 `cin` 读取字符变量。而 `(s+1)` 则是一个非法的表达式,因为 `cin` 无法直接读取一个指针。

综上所述,使用 `(s)` 可以正常编译和运行,而 `(s+1)` 则会导致编译错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-17 16:19:19 | 显示全部楼层
FishC 发表于 2024-5-17 16:16
在 C++ 中, `(s)` 和 `(s+1)` 实际上并没有本质的区别。两种写法都是将 `s` 作为一个表达式来处理。
...

可以把指针转换成字符变量吗,如果我一定需要使用 cin 从下标 1 开始读入 s 怎么办。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 16:19:29 | 显示全部楼层
zhangjinxuan 发表于 2024-05-17 16:19
可以把指针转换成字符变量吗,如果我一定需要使用 cin ...


指针可以转换为字符变量,但在实际应用中,可能并不适用或不安全。使用指针需要确保指针所指向的内存是有效的。

如果你需要从下标 1 开始读取字符到一个字符指针,你可以首先定义一个字符数组,然后将数组的第二个元素的地址赋给指针。这样就可以通过偏移来实现从下标 1 开始读取。

下面是一个示例代码:
#include <iostream>
using namespace std;

int main() {
    char arr[2]; // 定义一个包含两个元素的字符数组
    char* ptr = &arr[1]; // 将数组的第二个元素的地址赋给指针

    cin >> ptr; // 从下标 1 开始读取字符到指针

    // 输出结果
    cout << "输入的字符为:" << *ptr << endl;

    return 0;
}

请注意,在这种情况下,只有一个字符会被读入到指针所指向的位置。因此,指针前后的内存位置可能是未初始化的或者包含无效数据。确保在使用指针之前,你对其进行了正确的处理和验证。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-17 16:21:56 | 显示全部楼层
FishC 发表于 2024-5-17 16:19
指针可以转换为字符变量,但在实际应用中,可能并不适用或不安全。使用指针需要确保指针所指向的内存是 ...

[Error] no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'char*')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 16:22:12 | 显示全部楼层
zhangjinxuan 发表于 2024-05-17 16:21
no match for 'operator>>' (operand types are 'std: ...


抱歉,我之前的代码有误。

实际上,C++ 中的 `cin` 操作符无法直接读取一个字符指针。如果你需要从下标 1 开始读入字符到一个字符指针,你可以使用字符数组作为中间变量。

下面是一个示例代码:
#include <iostream>
#include <cstring> // 包含头文件以使用 strlen 函数
using namespace std;

int main() {
    char arr[100]; // 定义一个足够大的字符数组,用于存储输入的字符串
    cin >> (arr + 1); // 从下标 1 开始读取字符到字符数组

    char* ptr = arr + 1; // 将数组的第二个元素地址赋给指针

    // 输出结果
    cout << "字符指针内容:" << ptr << endl;
    
    return 0;
}

在这个示例中,我们定义了一个足够大的字符数组 `arr`,通过 `(arr + 1)` 从下标 1 开始读取字符到数组。然后,我们将数组的第二个元素的地址赋给字符指针 `ptr`,从而实现了从下标 1 开始读取的效果。

注意:由于字符指针的特性,输出字符指针时,会打印从指针所指向的位置开始的字符串,直到遇到空字符 `\0`。因此,输出字符指针时应确保指针所指向的字符串以空字符结尾,或者使用指定长度的方式输出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-17 16:24:00 | 显示全部楼层
FishC 发表于 2024-5-17 16:22
抱歉,我之前的代码有误。

实际上,C++ 中的 `cin` 操作符无法直接读取一个字符指针。如果你需要从 ...

[Error] no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'char*')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 16:24:14 | 显示全部楼层
zhangjinxuan 发表于 2024-05-17 16:24
no match for 'operator>>' (operand types are 'std: ...


非常抱歉,我之前的回答还是有误。

在 C++ 中,`cin` 无法直接读取一个字符指针。如果你需要从下标 1 开始读取字符到一个字符指针,可以使用字符数组作为中间变量,然后通过偏移来实现。

下面是一个示例代码:
#include <iostream>
using namespace std;

int main() {
    char arr[100]; // 定义一个足够大的字符数组,用于存储输入的字符串
    cin >> (arr + 1); // 从下标 1 开始读取字符到字符数组

    char* ptr = arr + 1; // 将数组的第二个元素地址赋给指针

    // 输出结果
    cout << ptr << endl;

    return 0;
}

以上代码中,我们定义了一个大小为100的字符数组 `arr`,然后使用 `cin` 从下标 1 开始读取字符到数组中。最后,将数组的第二个元素的地址赋给指针 `ptr`,并输出指针指向的字符串。

注意,在使用指针时要确保指针指向的内存是有效的,不越界且可访问。另外,由于在 ANSI C 标准中,字符数组下标从0开始,所以在C++中一般习惯使用从0开始的下标。如果没有特殊需求,建议从0开始使用下标来处理字符数组。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 17:34:33 | 显示全部楼层    本楼为最佳答案   
https://zh.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2

c++20之前有个这
 template< class Traits >
basic_istream<char, Traits>&
    operator>>( basic_istream<char, Traits>& st, signed char* s );

c++20开始变成了这样
 template< class Traits, std::size_t N >
basic_istream<char, Traits>&
    operator>>( basic_istream<char, Traits>& st, signed char (&s)[N] );

那么,你现在知道为什么cin >> s;可以,cin >> (s + 1);不行了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 17:38:03 | 显示全部楼层
话说你为什么要写signed main?
写int main不好吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 19:37:29 | 显示全部楼层
Mike_python小 发表于 2024-05-17 16:37
按照招生1:8的比例确定80名同学参加校级测试

什么 ...


不好意思,我之前的回答有误。

"按照招生1:8的比例确定80名同学参加校级测试" 的意思是,在符合招生比例 1:8 的情况下,确定参加校级测试的同学总数为 80 人。

这个比例指的是在某个群体中,招生比例为每 8 个人中就选取 1 个人进行招生,例如招收实际有限制的班级或者项目。按照这个比例,如果一共有 80 名同学参加校级测试,那么能够招收的同学总数会根据比例调整。

所以不是说9个人中有8个人能够参加,而是参加校级测试的同学总数为 80 人,并且根据比例计算确定能够招收的同学总数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表