【问题标题】:How to "remove" an element from an array of strings如何从字符串数组中“删除”一个元素
【发布时间】:2020-05-29 09:54:47
【问题描述】:

阅读了很多不同的答案,但找不到解决此问题的方法,所以我在这里提出了一个“操作方法”问题。

所以我试图从我创建的数组中“删除”一个元素。据我了解,没有办法简单地删除一个元素,而是需要将正在进行的元素移动到数组的左侧,从而用已经存在的元素覆盖你不想要的元素。

试图在我的 removeToDoItem 函数中完全做到这一点,但我得到的错误是:assigment to expression with array type.一直在关注本教程https://codeforwin.org/2015/07/c-program-to-delete-element-from-array.html,但似乎我是缺少一些东西。

#include <stdio.h>
#define Listsize 10
#define Stringsize 30
#include <string.h>

 void printToDolist(char toDolist[][Stringsize], int placering)
{
    for(int i= 0; i<placering; i++)
        printf("%d - %s\n", i+1, toDolist[i]);
}

int addToDoItem(char toDolist[][Stringsize], int placering)
{
    int i;
    for( i=1; i<=3; i++)
    {
    printf(" Add a note: ");
    fgets(toDolist[i], 30 , stdin);
    }

    return placering+i;
}

int removeToDoItem(char toDolist[][Stringsize], int placering)
{

    int position,i;


    printf(" Which element would you like to remove?: ");
    scanf("%d", &position);

    for(i=position-1; i< placering-1; i++)
    {
        toDolist[i] = toDolist[i+1];

    }
        return placering--;
}

int main()

{
char toDolist[Listsize][Stringsize] = {[0]= "Buy candy \n"};

int placering = 0;
placering = addToDoItem(toDolist, placering);
printToDolist(toDolist, placering);
removeToDoItem(toDolist, placering);

return 0;
}

【问题讨论】:

  • 你的错误信息是指哪一行?
  • @ScottHunter toDolist[i] = toDolist[i+1],在删除函数中
  • @pmg 谢谢伙计,那行得通。完全忘记了在这种情况下可以使用 strcpy xD。干杯 m8!

标签: c arrays string replace char


【解决方案1】:
    for(i=position-1; i< placering-1; i++)
    {
        toDolist[i] = toDolist[i+1]; // wrong: cannot assign to an array
                                     // toDolist[i] is an array of 30 characters
    }

你想要

     for (i = position - 1; i < placering - 1; i++) {
         strcpy(toDolist[i], toDolist[i + 1]);
     }

【讨论】:

  • 是的,这行得通。必须等待 8 分钟才能接受答案(出于某种原因),但这就是我想要的。谢谢!
【解决方案2】:

使用strcpymemcpy 代替toDolist[i] = toDolist[i+1]

此外,您实际上并没有正确删除该项目。如果你有字符串数组:“一”、“二”、“三”。假设您将删除第一个项目“一”,结果数组将是“二”、“三”、“三”。这可能不会对您的特定程序造成问题,但最好设置数组的最后一个元素清空字符串“”也是为了避免奇怪的结果。

您也不要使用removeToDoItem 函数的返回值来用新值覆盖旧的placering 值。而且如果你return placering--,会发生什么它会返回placering而不减少它,因为它增加了。宁愿这个return placering - 1

【讨论】:

  • 哦,是的,坐在代码 atm 旁边,我才意识到这一点。如何使用返回值?
  • 就像你对placering = addToDoItem(toDolist, placering);所做的那样
  • 掌心谢谢老兄。
  • 写了一些东西,但您的编辑版本修复了它。再次感谢老哥。你对如何精通 C 有什么建议吗?真的需要学习何时使用后增量而不是。
  • 只需编写代码,您就会遇到问题并从中学习。我也不认为自己很熟练。就像您编写代码一样,您会不时遇到问题并最终找出导致问题的原因并从中学习。您现在可能知道,如果您使用具有后增量的变量而不是首先使用其原始值,那么增量就会发生。第二天你可能会学到其他东西并最终积累你的知识。先尝试自己解决问题,但不要害怕提问。如果你想加快这个过程而不是阅读一些像 C 入门这样的书。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2021-10-15
  • 2023-03-04
  • 2015-06-23
  • 2022-11-16
  • 2020-05-18
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多