C - scanf不会停止字符串输入中的循环

时间:2014-03-26 15:35:16

标签: c

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

示例:如果我在“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)放在最后一行,它可以正常工作......为什么会这样?

此致

3 个答案:

答案 0 :(得分:2)

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

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

除非由于某种原因扫描是必需组件,否则可能会查看其他一些字符串函数来完成您的任务。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

为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);
}