计算

时间:2016-01-09 22:29:08

标签: c for-loop

我必须计算一个人在控制台中写入的 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。我不明白为什么这不起作用,如果有人帮助我,我将不胜感激:)

1 个答案:

答案 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;
}