我必须计算一个人在控制台中写入的 for 运算符,但我必须排除注释中的 // for 和 / * for 不应计算在内。 此外,多行注释中的for不应计算(直到用 * / 关闭)
这是我到目前为止所尝试的内容:
int flagcomment = 0;
char *pointerLine;
char string[130];
pointerLine = strtok(string, " (\t\n\b\r{}\\\'\";:)&^%$#@!~-+,.][_=");
while (pointerLine != 0)
{
printf("%d",flagcomment);
if (*pointerLine == '/' && *(pointerLine + 1) == '/')
break;
if (*pointerLine == 'for' && *(pointerLine + 1) == '"')
break;
if (*pointerLine == 'for' && *(pointerLine + 1) == '/')
break;
if (*pointerLine == '/' && *(pointerLine + 1) == '*' && (!flagcomment))
{
flagcomment = 1;
break;
}
if (flagcomment==1)
{
if (*pointerLine == '*' && *(pointerLine + 1) == '/')
{
flagcomment = 0;
break;
}
break;
}
它只在某些情况下有效 - 当我为编写 / *时,它会停止对它们进行计数,但是当结束多行注释时,我会为* / 编写但是for的我之后写的仍然是不计数的,但它认为当它找到 * / 时该标志应为0。我不明白为什么这不起作用,如果有人帮助我,我将不胜感激:)
答案 0 :(得分:0)
在你的代码中有很多东西看起来不正确,但这是最重要的错误
*pointerLine == 'for'
此比较不会将这个词与*pointerLine
的内容进行比较,'for'
是一个具有整数值的多字符常量,但该整数值是实现定义
你正在比较两个不太可能相等的整数,最重要的是你没有检查这个词,你的编译器是不是警告< em>多字符常量?
此外,
while (pointerLine != 0)
也许你的意思是
while (*pointerLine != 0)
,您必须在NULL
之后检查strtok()
。
我在飞行中对此进行动作,也许是正确的测试并检查
int
count_for_loops(const char *const string)
{
int mlcomment; // Multiline Comments
int ignoreline; // Comments
int forcount; // for loops count
mlcomment = 0;
ignoreline = 0;
forcount = 0;
if ((string[0] == '\0') || (string[1] == '\0') || (string[2] == '\0'))
return 0;
for (size_t i = 0 ; string[i + 2] != '\0' ; ++i)
{
switch (string[i])
{
case '/':
switch (string[i + 1])
{
case '*':
mlcomment = 1;
i += 1;
break;
case '/':
ignoreline = 1;
i += 1;
break;
}
break;
case '*':
if (string[i + 1] == '/')
{
mlcomment = 0;
i += 1;
}
break;
case '\n':
ignoreline = 0;
break;
case 'f':
if ((mlcomment != 0) || (ignoreline != 0))
continue;
else if ((string[i + 1] == 'o') && (string[i + 2] == 'r'))
{
forcount += 1;
i += 2;
}
break;
}
}
return forcount;
}