无法理解此C程序

时间:2019-03-12 14:51:40

标签: c pointers

我是编程新手,无法获取下面的代码。该程序检查字符c是否在字符串s中。

int is_in(char *s, char c){
  while(*s){
    if(*s==c) return 1;
    else s++;
  return 0;
}

最让我感到困惑的是,while循环将如何停止,因为我认为s++会在字符串结尾之后遍历整个内存。谁能解释一下?如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:3)

Pet为0时,即在NUL终止的字符串的末尾,循环停止。

在C语言中对字符串建模的惯用方式是用0终止请注意,如果不是以这种方式形成*s,则函数的行为为未定义

我个人更希望该函数为s,以便向调用者表示该函数不会修改字符串。

答案 1 :(得分:1)

您的直觉认为指针s将无限期地循环,如果不是出于两件事,您将是正确的:

  • C字符串以空终止符(字符'\0')终止。这是处理字符串的函数的哨兵值。这是必要的,因为当数组传递给函数时,它会衰减为指向其第一个元素的指针,从而丢失长度信息。
  • 到达空终止符时,循环条件while(*s)将为false。

实际上,while(*s) { loop-body; s++; }是C语言中用于处理字符串的众所周知的习语。

答案 2 :(得分:0)

字符串char *s应该以结束NUL结尾。 NUL的值为零。 *s最终应该“扩展”到零。