首页 > 解决方案 > 错误的输出格式 意外的文件结尾 - 预期 C++ 的令牌 - 什么可能导致这些错误?

问题描述

我收到一条错误消息,提示错误的输出格式意外的文件结尾 - 需要令牌`

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
    string A,B,C;
    cin>>A>>B;
    int i,len;
    len=A.length();
    for(i=0;i<len;i++){
      if(A[i]==B[i])
        C[i]='0';
        
      else
        C[i]='1';
    
    }
    cout<<C;

    return 0;
    }

标签: c++stringloopsprinting

解决方案


您的代码的问题是您正在写入未初始化的内存。当您创建一个std::string这样的

std::string C

这个字符串没有任何元素,它的支持字符数组很可能是空的。您可以通过执行来检查它C.size(),它应该返回 0。因此,C[0]在这种状态下执行类似的操作是未定义的行为,因为您正在写入一个字符串。您可以通过更改C[i]C.at(i)(使用该at功能)轻松检查,并且您应该遇到std::out_of_range错误。作为 的参考状态operator[]

返回对指定位置 pos 的字符的引用。不执行边界检查

因此,您当前的程序可能看起来工作正常,但事实并非如此。

将其更改为push_back/append有效,因为这些函数负责增加字符串的支持字符数组的大小(如果需要),然后才写入该内存。

如果您不想使用这些函数,那么一种方法是让字符串已经构造,即使用类似的东西

std::string C = A; // sets up a string which is the same as A

现在您可以安全地访问C[i]您的代码,因为它已经是 size A.size()。还有另一种方法可以构造一定大小的字符串,例如

std::string C = std::string(count, ch)

其中count是您最初想要在字符串中的字符数,并且ch是您要复制的字符count。次。所以像:

std::string C = std::string(A.size(), '1');

会构造类似"111000"ifA的长度为 6 的东西。

底线:您始终需要确保仅访问分配的内存。


推荐阅读