【问题标题】:wrong output format Unexpected end of file - token expected C++ - What could possibly be causing these error?错误的输出格式 意外的文件结尾 - 令牌预期 C++ - 什么可能导致这些错误?
【发布时间】:2021-07-18 02:11:26
【问题描述】:

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

    #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[i]='0' 也未定义,因为您正在访问未初始化字符串中的元素。你应该使用push_backB[i] 也是如此。如果B的长度小于A的长度怎么办?
  • @Zoso 没有 A 和 B 的长度总是相同的,我也收到错误为“错误的输出格式意外的文件结尾 - 预期的令牌”,这基本上意味着我的输出是空的/空白
  • @Zoso 还要检查这段代码,github.com/fuwutu/CodeForces/blob/master/… 在逻辑上没有什么不同,除了我使用的第三个字符串..
  • 这正是您的代码不正确的原因。您对第三个字符串的使用是错误的。为什么你认为C[i] 应该给你一个有效的值?

标签: c++ string loops printing


【解决方案1】:

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

std::string C

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

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

因此您当前的程序可能看起来可以正常工作,但不是。

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

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

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

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

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

其中count 是您最初希望在字符串中包含的字符数,ch 是您要复制的字符count 没有。次。所以像:

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

如果 A 的长度为 6,则将构造类似于 "111000" 的内容。

底线:您总是需要确保只访问分配的内存。

【讨论】:

  • 除了 append , insert , push_back ..还有其他方法可以使用相同的代码吗?就像没有这些附加或添加到字符串函数一样。
猜你喜欢
  • 2020-01-05
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多