祝余呀 2025-01-14 10:22 采纳率: 100%
浏览 6
已结题

c++中字符反转问题

我想知道为什么反转1那个代码没有报错但是运行不了。
源代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"hello world"<<endl;
    cout<<"hello world"<<'\n';
    printf("hello world");
    /*在全局定义的数组才能初始化为0,如果是在函数内部定义的数组
     则数组不能初始化为0*/
    char s[] = "hello";
    cout<<'\n';
    for(int i = 0;i <= 4;++i){
        cout<<s[i];
    } 
    cout<<'\n';
    cout<<s<<'\n';    //输出s(遇到\0就停下)并换行 
    //利用c.str()将输入的字符串转换成字符输出 
    char buf[100];// 临时变量,用于输入 
    scanf("%s",buf); //输入buf
    string str(buf);//用buf来构造str 
    printf("str = %s\n",str.c_str());//输出str 
    
    //获取字符串的长度
    string str0 = "hello, world!" ;
    int length = str0.length();
    cout<<"length:"<<length<<endl;
    
    //拼接字符串
    string str1 = "hello";
    string str2 = "world!";
    //方法一,用+号连接
     string result1 = str1 + "," + str2;
     //方法二,用append
     string result2 = str1.append(",").append(str2);
     cout<<"result1"<<result1<<endl; 
     cout<<"result2"<<result1<<endl;
     
     //字符串的查找
      string str3 = "hello, world!";
      int pos1 = str3.find("hello");
      int pos2 = str3.find("helllo");
      cout<<"substring found at position"<<pos1<<endl;
      cout<<"substring found at position"<<pos2<<endl;
      
      //字符串的替换
      string str4 = "hello, world!";
      str4.replace(7,5,"university");
      cout<<"reslut:"<<str4<<endl; 
      
      //提取字符串
      string str5 = "hello, world";
      string subStr = str5.substr(7,5);
      cout<<"subString:"<<subStr<<endl;
      
      //字符串的比较
      string str6 = "hello";
      string str7 = "world";
      int result = str6.compare(str7);
      if(result == 0){
          cout<<"string are equal."<<endl;
      }
      else if(result < 0){
          cout<<"string 6 is less than string 7.";
      }
      else{
          cout<<"string 6 is greater than string 7.";
      }
      
      //遍历string的方法
      string s0 = "hello";
      //(1)循环枚举下标
      for(int i = 0;i < s0.length();++i)
          cout<<s0[i];
      cout<<'\n';
      //(2)auto枚举(其中&表示引用类型,如果对i修改将会改变原来的值) 
      for(auto i:s0){
          cout<<i;
          i = 'a';
      } 
      cout<<'\n';
      cout<<s0<<'\n';  //hello
      cout<<'\n';
      
      for(auto &i : s0){
          cout<<i;
          i = 'a';
      }
      cout<<'\n';
      cout<<s0<<'\n';      //aaaaa
      
      //反转1
      string s1;
      cout<<"please enter a s1:"<<'\n';
      getline(cin,s1);
      for(int i = (int)s1.length()-1;i >= 0;--i){
          cout<<s1[i]<<'\n';
      }
      
      //反转2
       string s2;
       cout<<"please enter a s2:"<<'\n';
      getline(cin,s2);
      reverse(s2.begin(),s2.end());
      cout<<s2<<'\n';
      return 0;     
}

运行结果如下:

img

img

  • 写回答

5条回答 默认 最新

  • 猿享天开 优质创作者: 编程框架技术领域 2025-01-14 10:31
    关注

    分析问题
    您提到代码在“反转1”部分没有报错但无法正常运行,具体表现为程序没有按照预期输出反转后的字符串,而 reverse(反转2)部分则可以正常工作。

    根据您的代码:

    // 反转1
    string s1;
    cout << "please enter a s1:" << '\n';
    getline(cin, s1);
    for (int i = (int)s1.length() - 1; i >= 0; --i) {
        cout << s1[i] << '\n';  // 这里每次输出一个字符并换行
    }
    

    问题定位

    1. 输出问题
      • 您的代码中 cout << s1[i] << '\n'; 每次输出一个字符后换行,这意味着每个字符将单独占一行。如果您希望整个字符串在同一行反向输出,应该去掉换行符 '\n'
    2. 输入输出流问题
      • 在使用 getline(cin, s1) 之前,如果之前有其他输入操作(如 cin),可能会导致 getline 读取到残留的换行符。为避免此问题,可以在调用 getline 之前添加 cin.ignore(),以忽略掉输入缓冲区中的换行符。

    修正代码

    以下是修正后的代码:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        // 反转1
        string s1;
        cout << "please enter a s1:" << '\n';
        cin.ignore();  // 忽略掉之前残留的换行符
        getline(cin, s1);  // 读取整行输入
        
        cout << "Reversed s1: ";
        for (int i = (int)s1.length() - 1; i >= 0; --i) {
            cout << s1[i];  // 输出字符不换行
        }
        cout << '\n';  // 最后统一换行
    
        // 反转2
        string s2;
        cout << "please enter a s2:" << '\n';
        getline(cin, s2);
        reverse(s2.begin(), s2.end());
        cout << "Reversed s2: " << s2 << '\n';
    
        return 0;
    }
    

    详细解释

    1. **cin.ignore()**:

      • 在使用 getline 读取输入之前,调用 cin.ignore() 可以忽略掉输入缓冲区中的残留换行符,确保 getline 能正确读取用户输入的整行字符串。
    2. 换行问题

      • 原代码中 cout << s1[i] << '\n'; 每次输出一个字符并换行,导致每个字符单独占一行。修正后,去掉每次输出后的换行符,改为在循环结束后统一换行。

    测试示例

    假设您输入的字符串为 "hello",则程序输出应为:

    please enter a s1:
    hello
    Reversed s1: olleh
    please enter a s2:
    hello
    Reversed s2: olleh
    

    总结

    问题的根源在于:

    1. 输入缓冲区残留换行符:需要在 getline 之前调用 cin.ignore() 来忽略残留换行符。
    2. 不必要的换行输出:在循环中每次输出字符后换行,改为统一换行。

    希望这个解释能帮助您解决问题!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 已采纳回答 1月14日
  • 创建了问题 1月14日