冒号在C语言中起啥作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒号在C语言中起啥作用相关的知识,希望对你有一定的参考价值。
RT。
在一段程序中看到mos:这么句话。看不懂唉?
冒号在C语言中有以下几种作用:
1.语句标识,与goto语句配合使用。如:
c++;if (c>3) goto next;
if (c<2)
c--;
next: return;
由于goto语句会造成不易阅读等情况,因此应避免使用
2.条件赋值语句的组成部分
a=(a>3)?1:2;
冒号将前面的条件语句在真和假两种情况的不同取值进行了分隔。
3.位域
struct Kint a:1;
int b:2;
这里用作指示位宽的标识,上例中,a占一个位宽,b占两个位宽。
4.switch语句的case分支标识
switch(表达式)case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
…
case 常量表达式n: 语句n;
default: 语句n+1;
在case后面跟一个常量表达式,再加上冒号,作为不同分支的入口条件。
构造函数将自动调用t来初始化_a.
这比_a = t更好。
因为更快。如果你不写初始化列表,编译器也会自动调用类型_a的构造函数来初始化_a.
更多请见Effective C++..这是本经典c++书。
参考资料:http://zhidao.baidu.com/question/48388489.html
参考技术B mos: 一个标志可以在别的地方goto mos;
就可以执行mos后的指令了。本回答被提问者采纳 参考技术C 我估计可能是这个程序中有个goto语句
例如:
mos:for(i=0;;i++)
if(i==100)
goto mos;
else i++;
break;
参考技术D 输入的数据用冒号“:”进行分隔。
string1 中的 string2 计数在 C 中不起作用,但在 Python 中起作用
【中文标题】string1 中的 string2 计数在 C 中不起作用,但在 Python 中起作用【英文标题】:Count of string2 in string1 not working in C, but works in Python 【发布时间】:2022-01-06 13:06:04 【问题描述】:问题本身很简单。我必须计算 s1 中 s2 的出现次数。 s2 的长度始终为 2。我尝试用 C 来实现它,但即使我知道逻辑是正确的,它也不起作用。所以我在 pyhton 中尝试了相同的逻辑,并且效果很好。有人可以解释为什么吗?还是我在 C 语言中做错了什么。我在下面给出了两个代码。
C
#include<stdio.h>
#include<string.h>
int main()
char s1[100],s2[2];
int count = 0;
gets(s1);
gets(s2);
for(int i=0;i<strlen(s1);i++)
if(s1[i] == s2[0] && s1[i+1] == s2[1])
count++;
printf("%d",count);
return 0;
Python
s1 = input()
s2 = input()
count = 0
for i in range(0,len(s1)):
if(s1[i] == s2[0] and s1[i+1] == s2[1]):
count = count+1
print(count)
【问题讨论】:
你永远不应该使用gets
。它被认为是危险的,在标准中已被淘汰。请查看fgets
的手册。您的第二个字符串s2
只能保存长度为 1 的字符串。终止 0 字节需要第二个字节。如果输入超过 1 个字符,则会导致缓冲区溢出,从而导致未定义的行为。
这不是导致问题的原因,但您的 for 循环可以在最后一次迭代时从数组外部访问数据
这能回答你的问题吗? find the count of substring in string
s1[i+1]
这可能不会越界访问数组,但如果i == strlen(s1)-1
这不是您想要的,它将达到 0 字节。
感谢@Gerhardh,它现在可以工作了。所以 s2 的大小是问题所在。我从没想过 '\0' 在字符串中也需要空格。 :)
【参考方案1】:
您的 python 代码实际上不正确,如果 s1
的最后一个字符与 s2
的第一个字符匹配,它将引发 IndexError
。
您必须停止迭代 s1
的倒数第二个字符。
这是一个适用于任意长度 s2
的通用解决方案:
s1 = 'abaccabaabaccca'
s2 = 'aba'
count = 0
for i in range(len(s1)-len(s2)+1):
if s2 == s1[i:i+len(s2)]:
count += 1
print(count)
输出:3
【讨论】:
谢谢。我会记住这一点。【参考方案2】:首先,正如其他人指出的那样,您不想使用gets(),请尝试使用fgets()。否则,您的逻辑是正确的,但是当您在输入中读取时,新行字符将包含在字符串中。
如果您要输入test
和es
,您的字符串将包含test\n
和es\n
(两者分别包含空终止字节\0
)。然后导致您在字符串test\n
中搜索它找不到的子字符串es\n
。因此,您必须首先从要搜索的子字符串中删除换行符,您可以使用 strcspn() 为您提供es
。
一旦尾随换行符 (\n) 被替换为空终止字节。您可以在字符串中搜索出现次数。
#include<stdio.h>
#include<string.h>
int main()
char s1[100], s2[4];
int count = 0;
fgets(s1, 99, stdin);
fgets(s2, 3, stdin);
s1[strcspn(s1, "\n")] = '\0';
s2[strcspn(s2, "\n")] = '\0';
for(int i=0;i < strlen(s1) - 1;i++)
if(s1[i] == s2[0] && s1[i+1] == s2[1])
count++;
printf("%d\n",count);
return 0;
【讨论】:
那么您还应该在解释中说明导致问题的原因。gets
只是其中的一部分。
@Gerhardh 如果您不关心换行符,则无需 4 大小来读取 2 个字符。 fgets
将始终添加 NUL 终止符,如果它位于 sizeof(buf) - 1
处,则覆盖换行符:godbolt.org/z/KdT6xq31G
@yano 你是对的。我忘记了。以上是关于冒号在C语言中起啥作用的主要内容,如果未能解决你的问题,请参考以下文章