【问题标题】:How to avoid entering strings already present in a list如何避免输入列表中已经存在的字符串
【发布时间】:2020-09-02 03:34:25
【问题描述】:

在这段代码中,我试图检查一个字符串(在我的例子中是俱乐部的名称)是否已经从标准输入中输入。我的目标是避免输入列表中已经存在的名称,但它不起作用。 有人能帮助我吗? 谢谢大家。

gets(club[i].name);
if(i != 0){
    for(left = 0; left < i; left++){
        for(right = i; right > 0; right--){
            outcome = strcmp(club[left].name, club[right].name);
            if(outcome == 0){   
                printf("You already entered this team. Pick another one: \n");
                gets(club[i].name);
            }
        }
    }
}
i++;
break;

【问题讨论】:

  • 不要使用gets()。它没有边界检查,已从语言中删除。
  • 我不明白你为什么要使用嵌套循环。您只想将此名称与所有以前的名称进行比较,不需要将所有名称相互比较。
  • 实际上,我必须将输入的每个字符串与以前的名称进行比较。如果不清楚,我很抱歉
  • 您输入一个名称,然后将其与所有以前的名称进行比较。但是您不需要将所有以前的名称相互比较,因为您知道它们不是重复的。

标签: c arrays string loops struct


【解决方案1】:

说说你的逻辑吧。除了多余的比较,我认为你需要重新设置left的值并打破内循环

按照你的逻辑,代码应该是:

gets(club[i].name);
if(i != 0){
    for(left = 0; left < i; left++){
        for(right = i; right > 0; right--){
            outcome = strcmp(club[left].name, club[right].name);
            if(outcome == 0){   
                printf("You already entered this team. Pick another one: \n");
                gets(club[i].name);
                left = 0;
                break;
            }
        }
    }
}
i++;
break;

【讨论】:

    【解决方案2】:

    我不确定算法。 (此外,请使用fgets 而不是gets

    您应该与[i] 进行比较,而不是其他值。

    这比左/右算法简单:

    int ok = 1;
    for(int j = 0; j < i && ok ; j++){
       ok = strcmp(club[j].name, club[i].name);
    }
    if ( ! ok) {
       // ask again on the same 'i'
    }
    

    AFAIU,i 是最后一项,所以j0 变为i-1

    您不需要嵌套循环,因为每个输入都已与之前的输入进行过检查。所以当一个新的来的时候,你只需要和之前的值进行比较就可以了。

    编辑:如果 n 是项目数(项目 i 当前正在输入,但并不总是最新的),请改用该算法

    int ok = 1;
    for(int j = 0; j < n && ok ; j++){
       ok = j == i || strcmp(club[j].name, club[i].name);
    }
    if ( ! ok) {
       // ask again on the same 'i'
    }
    

    【讨论】:

    • 您的意思是j &lt; n &amp;&amp; ok,其中n 是列表的元素数,而不是j &lt; i &amp;&amp; ok
    • 基于 OP 的代码,我假设最后一项(当前正在输入)是[i]。我没有看到任何n。我还是添加了n 代码:-)
    • 是的,看来,OP选择了一个很糟糕的名字,i通常代表迭代器:(
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2022-01-17
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多