【问题标题】:C - scanf doesn't stop looping in string inputC - scanf 不会停止在字符串输入中循环
【发布时间】:2014-03-26 15:35:16
【问题描述】:

我正在做一个小测试,看看一个词是否在另一个词中,我想返回那个词开始的索引。

示例:如果我在“amolum”中检查“um”,则返回值应为 4(单词开头的字母“u”的位置。

这是我的代码的样子:

(...)
int cad_look_str (char s1[], char s2[]) {
  int indS1 = 0, indS2 = 0;

  while (s1[indS1]!='\0'|| s2[indS2]!='\0') {
    if (s1[indS1]==s2[indS2]) {
      indS1++;
      indS2++;
    }
    else indS1=0;
  }

  if (s2[indS2]=='\0' && s1[indS1]!='\0') return -1;
  else return indS2-strlen (s1);
}


void main () {
  char s[100];
  char s1[100];

  scanf ("%s",s); 
  scanf ("%s",s1);

  printf ("%d \n", cad_look_str(s1,s) );
}

问题是当我编译它时,它并没有停止在 scanf 上循环......它只是继续询问字符串。

如果我将 cad_look_str(s1,s1) 放在最后一行,它可以正常工作...为什么会这样?

问候

【问题讨论】:

  • 你忘记在 else 中使用 indS2++(否则你会永远卡在那里)
  • @Inox yeap 在 David 的帮助下发现了这一点:P 谢谢
  • 认为现在的问题是你在'gdgddadada'的第一个索引位置找到了一个与'd'字符匹配的initial,但下一个索引失败,因此您应该将目标字符串索引重置为 0,以确保在搜索字符串的开头重新开始搜索...也就是说,一旦您 开始 匹配,如果匹配最终在比较整个字符串之前失败,你必须意识到这一点。可能需要在那里添加一些额外的控制逻辑。
  • @DavidW 是的,它有帮助。对于这种情况,我已经实施了一个控制。 " else if ( s1[0] == s2[indS2] ) {indS1=1; indS2++;} else{indS1=0; indS2++;}"

标签: c


【解决方案1】:

如果第一个字符与 if 语句中的比较测试不匹配,您的初始循环条件将永远不会终止。

'while' 循环检查以确保当前字符位置(第一遍均为 0)是非终止符。如果它们不是,并且它们不相等,indS1 将重置为其起始位置。 indS2 永远不会改变,因此 while 条件不变。

可能会查看其他一些字符串函数来完成您的任务,除非出于某种原因扫描是强制性组件。

【讨论】:

  • 谢谢! else 条件应该增加 indS2。它现在可以工作了:P
【解决方案2】:

第二个字符串的索引也应该在 else 部分增加。

if (s1[indS1]==s2[indS2])
{
        indS1++; indS2++;
}
else {
         indS1=0;
         indS2++;
}

【讨论】:

  • 如果我在单词“gdgddadada”中测试例如“dadada”,我会得到一个分段折叠
  • 如果 s1 比 s2 长,增加索引 indS2 将导致它超出该数组的边界,遍历未分配的区域并导致您的分段错误。
  • 嗨@DavidW,但事实并非如此...... dadada 有 6 个字符,小于 S2 字。我在“asf”中尝试过“b”,它应该返回-1,对吗?它也爆炸了
  • while (s1[indS1]!='\0'|| s2[indS2]!='\0') 替换为 while (s1[indS1 ]!='\0'&& s2[indS2]!='\0')
  • 注意:第一个输入字符串应该大于第二个输入字符串(子字符串)
【解决方案3】:

针对 s1 : gdgddadada、s2 : dadada 等情况更改了 cad_look_str()

int cad_look_str (char s1[], char s2[]) {
  int indS1 = 0, indS2 = 0;
  int flag = 0;


  while (s1[indS1]!='\0'&& s2[indS2]!='\0') {
    if (s1[indS1]==s2[indS2]) {
      indS1++;
      indS2++;
      flag = 1;
    }
    else 
    {
        indS1=0;
        indS2++;
        if(flag) indS2--; // to work with srtrings s1: gdgddadada s2: dadada
        flag = 0;
    }
  }

  if (s2[indS2]=='\0' && s1[indS1]!='\0') return -1;
  else return indS2-strlen (s1);
}

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2015-01-23
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多