不能理解这个C程序

不能理解这个C程序,c,pointers,C,Pointers,我是编程新手,不懂下面的代码。该程序检查字符串s中是否有字符c 最让我困惑的是,while循环将如何停止,因为,我认为s++将在字符串结束后遍历整个内存。有人能解释一下吗?如果我错了,请更正。字符串char*s应该以终止NUL结尾。NUL的值为零。零是*s最终应该扩展到的值。字符串char*s应该以终止NUL结尾。NUL的值为零。零是*s最终应该扩展到的值。当*s为0时,即在以NUL结尾的字符串末尾,循环停止 在C中建模字符串的惯用方法是以0结尾。请注意,如果s不是以这种方式形成的,那么函数的行

我是编程新手,不懂下面的代码。该程序检查字符串s中是否有字符c

最让我困惑的是,while循环将如何停止,因为,我认为s++将在字符串结束后遍历整个内存。有人能解释一下吗?如果我错了,请更正。

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

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

当*s为0时,即在以NUL结尾的字符串末尾,循环停止

在C中建模字符串的惯用方法是以0结尾。请注意,如果s不是以这种方式形成的,那么函数的行为是未定义的

就我个人而言,我更希望函数为int is incont char*s,char c,以向调用者表示函数不修改字符串。

循环在*s为0时停止,即在以NUL结尾的字符串的末尾

在C中建模字符串的惯用方法是以0结尾。请注意,如果s不是以这种方式形成的,那么函数的行为是未定义的


就我个人而言,我更希望函数为int is incont char*s,char c,以向调用者表示函数不修改字符串。

如果不是因为以下两个原因,指针s将继续无限循环的直觉是正确的:

C字符串由空终止符“\0”终止。它充当处理字符串的函数的哨兵值;这是必要的,因为当数组传递给函数时,它会衰减为指向其第一个元素的指针,从而丢失长度信息。 当达到空终止符时,while*s循环条件将为false。
事实上,*s{loop body;s++;}是C中处理字符串的一个众所周知的习惯用法。

如果不是因为以下两个原因,指针s将无限期地继续循环的直觉是正确的:

C字符串由空终止符“\0”终止。它充当处理字符串的函数的哨兵值;这是必要的,因为当数组传递给函数时,它会衰减为指向其第一个元素的指针,从而丢失长度信息。 当达到空终止符时,while*s循环条件将为false。
事实上,当*s{loop body;s++;}是C语言中处理字符串的一个众所周知的习惯用法。

While*s最终会保存这个循环,因为字符串以null结尾,所以即使找不到目标,它也会终止,除非字符串没有null终止符……然后你会被拧到,直到它碰到一个随机的null byteI,我会说你的代码列表某处需要一个右括号,不是吗?@BaileyKocin如果字符串没有空终止符,它不是一个字符串。@glglgl Mind partially blownWhile*s将在最后保存这个循环,因为字符串以null结尾,所以即使找不到目标,它也会终止,除非字符串没有null终止符……然后你会被拧到,直到它碰到一个随机的null byteI,我会说你的代码列表某处需要一个右括号,不是吗?@BaileyKocin如果字符串没有空终止符,它就不是字符串。@glglglgl Mind blownThanks。但是,我有另一个问题,s++不是将内存位置增加了1个1字节的类型单位吗?那么它将如何一次读取\0?由于\将占用1个字节,0将位于下一个字节。@AshisGhosh错误,“\0”是数值为零的字符的转义序列,它是一个字节。但是,我有另一个问题,s++不是将内存位置增加了1个1字节的类型单位吗?那么它将如何一次读取\0?因为\将占用1个字节,0将位于下一个字节。@AshisGhosh错误,“\0”是数值为零的字符的转义序列,它是一个字节
int is_in(char *s, char c){
  while(*s){
    if(*s==c) return 1;
    else s++;
  return 0;
}