【问题标题】:Code crashes. Trying to remove characters from char array C代码崩溃。试图从 char 数组 C 中删除字符
【发布时间】:2014-12-02 20:44:55
【问题描述】:

我基本上是想在数组中某个索引之后存储所有内容。

例如,我想存储一个声明为char name[10] 的名称。如果用户输入 15 字符,它将忽略前五个字符并将其余字符存储在 char 数组中,但是,我的程序崩溃了。

这是我的代码

char name[10];
cout<< "Starting position:" << endl;
cin >> startPos;
for(int i= startPos; i< startPos+10; i++)
{
  cout << i << endl; // THIS WORKS
  cout << i-startPos << endl; // THIS WORKS
  name[i-startPos] = name[i]; // THIS CRASHES
}

例如,如果我的名字是McStevesonse,我希望程序只存储第三个位置的所有内容,所以最终结果是Stevesonse

如果有人能帮我解决这个崩溃问题,我将不胜感激。

谢谢

【问题讨论】:

  • 如果name 声明为name[10]startPos &gt; 0,则i 将大于10,因此name[i] 将访问超出分配的空间。您发布的代码在该上下文中不是很清楚,因为您用文字描述了一半,而不是在代码中。
  • 如何将用户输入的15个字符存储到char name[10]变量中?当你知道这个问题的答案时,你就会明白问题所在。不幸的是,您的程序的这一部分不在您的问题中,所以我无法回答这个问题。但是,我可以告诉你,不可能将 15 个字符存储到 10 个 chars 的数组中而不会导致“未定义的行为”,这通常会在以后转化为崩溃。
  • 您提供的代码似乎与您提出的问题无关。 If the user inputs in say 15 characters ...;我没有看到您的程序在任何地方询问用户名。请改写您的问题和/或添加MCVE

标签: c++ arrays truncation strncpy


【解决方案1】:

假设 i 等于 3。在循环的最后一次迭代中,i 现在等于 12,所以用 12 代替 i,你的最后一行是

name[12-startPos] = name[12];

name[12] 超出数组范围。根据您目前所展示的内容,在您开始执行此分配之前,name 中除了垃圾之外什么都没有存储,因此您所做的就是重新组织数组中的垃圾。

【讨论】:

    【解决方案2】:

    请在未来发布完整的可编译示例。 一个简单的答案是您的数组 maybe 超出了界限,因为您没有提供完整的示例,因此很难确切知道。

    这是一个工作示例:

    #include <iostream>
    using namespace std;
    
    int main() {
    int new_length, startPos;
    int length = 15;
    char name[15]= "McStevesonse";
    
    cout<< "Starting position:" << endl;
    cin >> startPos;
    if(new_length <1){ // you need to check for negative or zero value!!!
        cout << "max starting point is " <<length-1 << endl;
        return -1;
    }
    new_length=length-startPos;
    char newname[new_length];
    for(int i= 0; i<new_length; i++){
      newname[i] = name[i+startPos]; // THIS CRASHES
    }
    cout << "old name: " <<  name << " new name: " << newname << endl;
    return 0 ;
    }
    

    【讨论】:

      【解决方案3】:

      简单地说,改变这个:

      for(int i= startPos; i< startPos+10; i++)
      


      至此:

      for(int i= startPos; i<10; i++)
      


      你应该没问题。



      说明:

      在某些时候,当您使用旧循环时,此 name[i-startPos] = name[i] 最终会超出数组索引并导致崩溃。

      别忘了清理/隐藏垃圾:
      这样做会导致输出产生某种垃圾输出。如果你有一个字符数组 'ABCDEFGHIJ',并且选择了 3 作为起始位置,那么数组将被排列到 'DEFGHIJHIJ'。在您的输出中,您至少应该隐藏多余的字符,或者通过放置 \0's 来删除

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 2022-01-06
        • 2015-02-06
        • 2022-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多