Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 程序仅打印C+;中数组的前三个字符+;_C++_C++11 - Fatal编程技术网

C++ 程序仅打印C+;中数组的前三个字符+;

C++ 程序仅打印C+;中数组的前三个字符+;,c++,c++11,C++,C++11,我的程序是将字符读入数组并显示到控制台。但我不知道为什么它只读前3个字符 #include <iostream> using namespace std; int main() { int length=0,i; char str[10]; cout<<"Enter a string"<<"\n"; for(i=0; str[i] != '\0'; i++) { cin>>str[i];

我的程序是将字符读入数组并显示到控制台。但我不知道为什么它只读前3个字符

#include <iostream>

using namespace std;
int main() {    
    int length=0,i;
    char str[10];
    cout<<"Enter a string"<<"\n";

    for(i=0; str[i] != '\0'; i++) {
        cin>>str[i];
    }

    for(int i=0; str[i]!='\0'; i++) {
        cout<<str[i];
        length++;
    }
    cout<<"\n"<<"Length of the string="<<""<<length<<"\n";
}
#包括
使用名称空间std;
int main(){
int长度=0,i;
char-str[10];

coutstr[i]!='\0'检查存储在str[i]的预先存在的数据,而不是用户输入值。

以下是我注意到的一些问题:

  • 在初始化之前,您正在检查
    str
    的内容
  • 您假设从流中获取的字符串将以null结尾,但事实并非如此
  • 您没有检查cin是否正常工作
  • 如果不检查字符串是否小于等于10个字符,则可能导致溢出超过缓冲区的末尾
  • 在检查数组长度时,再次假定字符串以null结尾
  • 如果您想解决这些问题并仍然使用字符缓冲区,请参阅user4581301的综合答案。但是,我建议您只需切换到
    std::string即可。
    例如:

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
        string str;
        cout<<"Enter a string"<<"\n";
        if (cin >> str) {
            cout << str << endl;
            cout << "Length of the string = " << str.length() << endl;
        }
    }
    
        std::string str;
        for(char c; cin>>c && c!=/*add your termination cond. here*/;) 
            str += c;
    
    #包括
    使用名称空间std;
    int main()
    {
    字符串str;
    
    cout添加字符串初始化:

    char str[10] = {'\0'};
    
    并将读数更改为:

    char c;
    for(int i = 0; cin>> c && c!=/*add your termination cond. here*/ && i < 10;++i)
        str[i] = c;
    

    您可以逐个字符读取并将其存储在
    str[i]
    中;但在选中
    str[i]!='\0'
    之前,您可以先递增
    i++

    这种方法有两个问题:首先,检查某个位置的值,该位置在该时间点尚未写入。其次,
    cin>>str[i]
    永远不会写入字符串终止字符-它只读取有效字符,如果输入被终止(例如,通过EOF),则不会写入任何内容

    所以你的做法是错误的

    如果您希望最多读取10个字符直到新行(即当用户按enter键时),请使用
    fgets
    。或者-这是首选选项-使用
    cin
    并写入
    std::string
    -对象

    int main()
    {
        std::string str;
        cin >> str;
        std::cout << str << std::endl;
    }
    
    intmain()
    {
    std::字符串str;
    cin>>str;
    STD:太长了,读不下去了
    使用
    str[i]
    在赋值之前。程序可能在为
    str
    分配的内存块中发现了一个空字符,并提前停止,但从技术上讲,如果使用未初始化的变量,可能会发生任何情况。例如,在找到空字符之前,您得到了预期的结果3次。程序永远找不到空字符,并且永远奔跑。可能会下独角兽雨。任何事

    int i = 0;
    do {
        cin>>str[i];
    } while (str[i++] != '\0');
    
    读取然后测试。但是流中的数据行不是C样式的字符串,并且不会以null结尾

    int i = 0;
    do {
        cin>>str[i];
    } while (!std::isspace(str[i++]));
    
    在找到空白时退出,通常表示单词的结尾,而不是null

    但是如果由于某种原因,
    cin>>str[i];
    失败了怎么办

    int i = 0;
    do {
        cin>>str[i];
    } while (cin && !std::isspace(str[i++]));
    
    添加一个测试以确保某些内容已被读取。但是如果有超过10个字符,并且
    char str[10];
    溢出了怎么办

    int i = 0;
    do {
        cin>>str[i];
    } while (cin && !std::isspace(str[i]) && ++i < sizeof(str));
    

    我认为这涵盖了你在这里可能遇到的一切。

    你应该学习。
    for(I=0;str[I]!='\0';I++)…
    在这行中
    str[I]
    有未定义的内容(因为你从未初始化过
    str
    ),你无法测试它的值。
    for(I=0;str[I]!='\0';I++
    for(I=0;I
    ,读取未初始化的数据会调用未定义的行为。
    for(i=0;str[i]!='\0';i++){
    哪个str[i]将包含一个‘0’?切换到STD::String…我们生活在C++世界中。代码STR < /COD>在检查之前被取消,所以检查实际上不需要发生。恐怕没有。在流中没有空字符的保证。流不是C风格字符串。没关系,看起来已经有一些好的解释建议插件了。g不管怎么说,答案确实会不时被删除,你应该努力做到自给自足。好吧,我添加了我注意到的东西,但我也指出了你的答案,因为我认为这是如何使用字符缓冲区的一个很好的分解。它不会破坏循环,因为循环检查输入的字符,而不是string本身。你是对的,它对维护人员不友好,但这不是问题。
    str[i]
    中的
    while
    -测试没有初始化。你需要测试
    str[i-1]
    @peje你看到了一些我没有看到的东西。请解释。@user4581301:
    cin>>str[i];i++}while(…isspace(str[i])
    测试到目前为止尚未写入
    str
    的值。。。
    int i = 0;
    do {
        cin>>str[i];
    } while (cin && !std::isspace(str[i++]));
    
    int i = 0;
    do {
        cin>>str[i];
    } while (cin && !std::isspace(str[i]) && ++i < sizeof(str));
    
    int i = 0;
    do {
        cin>>str[i];
    } while (cin && !std::isspace(str[i]) && ++i < sizeof(str));
    if (i == sizeof(str))
    {
        str[sizeof(str)-1] = '\0';
    }