C++字符数组写入时缓冲区溢出,急!

1144:单词翻转

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 32682 通过数: 14793
【题目描述】
输入一个句子(一行),将句子中的每一个单词翻转后输出。

【输入】
只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。

【输出】
翻转每一个单词后的字符串,单词之间的空格需与原文一致。

【输入样例】
hello world
【输出样例】
olleh dlrow

#include<iostream>
#include<cstring>
using namespace std;
int main() {
    char sent[501], a;
    //t为计数器,后面会使用;index为单词起始位置,方便提取单词
    int t = 0, index = 0;
    cin.getline(sent, 501);
    size_t l = strlen(sent);
    //开始翻转
    for (int i = 0; i < l; i++) {
        //如果单词并没有结束,则计数器t+1
        if (sent[i] != ' ') t++;
        //如果单词结束,开始翻转工程
        else {
            //翻转
            for (int j = index; j <= index + t; j++) {
                //交换,空瓶子法
                a = sent[(index + t) - j - 1];//写入溢出位置
                sent[(index + t) - j - 1] = sent[j];//读取无效数据
                sent[j] = a;
            }
            //下一个单词的起始位置设在空格后一位
            index = index + t + 1;
            //计数器归零,为下一次做准备
            t = 0;
        }
    }
    //输出转换后的句子
    for (int i = 0; i < l; i++) {
        cout << sent[i];
    }
    return 0;
}

写入sent时缓冲区溢出
警告 C6386 写入 "sent" 时缓冲区溢出。

我看完循环以后,发现索引并没有超出到。求修改并且指出问题,谢谢。

当j等于index+t的时候,sent[(index + t) - j - 1]的下标岂不是-1了???

你是不是对题目有误解?
题目只要求输出,没有要求你存放。
思路:

  1. 倒序判断空格
  2. 如果遇到空格,输出
  3. 如果到头,退出
    123 456 789
    倒序,遇到第一个空格时,789 完成,输出即可,
    继续,下一个空格,456完成,输出
    继续,到头了,输出,退出