对于C中的循环未完全执行

时间:2015-02-17 00:06:47

标签: c for-loop

似乎在处理拆分给定字符串的for循环中,它只会在退出之前执行两次,而不会使用我放在其中的if语句以及isValid函数执行检查。我试图对包含给定字符串的缓冲区的输入进行简单检查。如果我注释掉第一个'printf'语句下面的代码块,它将通过打印出每个标记化的字符串来正确执行。离开它,它只会打印前两次迭代(i为0,1),然后不会发生其他任何事情。我似乎无法弄清楚为什么会这样。

这是我的代码:

void processRequest (int socket)
{
   int n, i=0,error_code = 1;
   char buffer[256], parsed_input[256];
   char* token;
   n = read(socket,buffer,255);

   for (token = strtok(buffer, " "); i, token; token = strtok(NULL, " "),i++)
   {
      printf("Argument %d: %s\n", i,token);
      if(i == 0 && (strcmp(token,"bye") == 0))
      {
        error_code = -5;
        break;
      }
      else if(i == 0 && (strcmp(token,"terminate") == 0))
      {
        exit(0); 
      }
      if((error_code = isValid(token, i)) != 1)
        break;
   }
}

isValid的实现:

int isValid(char* token, int i)
{
    switch(i){

        case 0: 
            if((strcmp(token,"add") == 0) || (strcmp(token,"subtract") == 0) || (strcmp(token,"multiply") == 0))
                return 1;
            else 
                return -1;
            break;
        case 1: 
        case 2:
        case 3:
        case 4:
            if(isdigit(token))
                return 1;
            else 
                return -4;
            break;
        default:
            return 1;
            break;
    }
}

1 个答案:

答案 0 :(得分:1)

此演示代码显示您的代码可以正常工作:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int isValid(char *token, int i);
void processRequest(void /*int socket*/);

void processRequest(void /*int socket*/)
{
    int i = 0;
    int error_code = 1;
    char buffer[256] = "subtract 123 103 11 2 elephants cavorting";
    char *token;
    //int n = read(socket,buffer,255);

    int n = strlen(buffer);
    printf("[%.*s]\n", n, buffer);

    for (token = strtok(buffer, " "); token; token = strtok(NULL, " "), i++)
    {
        printf("Argument %d: %s\n", i, token);
        if (i == 0 && (strcmp(token, "bye") == 0))
        {
            error_code = -5;
            break;
        }
        else if (i == 0 && (strcmp(token, "terminate") == 0))
        {
            exit(0);
        }
        if ((error_code = isValid(token, i)) != 1)
            break;
        printf("error_code = %d\n", error_code);
    }
}

int isValid(char *token, int i)
{
    switch (i)
    {
    case 0:
        if ((strcmp(token, "add") == 0) ||
            (strcmp(token, "subtract") == 0) ||
            (strcmp(token, "multiply") == 0))
            return 1;
        else
            return -1;
        break;
    case 1:
    case 2:
    case 3:
    case 4:
        if (isdigit(*token))
            return 1;
        else
            return -4;
        break;
    default:
        return 1;
        break;
    }
}

int main(void)
{
    processRequest();
    return 0;
}

示例运行:

[subtract 123 103 11 2 elephants cavorting]
Argument 0: subtract
error_code = 1
Argument 1: 123
error_code = 1
Argument 2: 103
error_code = 1
Argument 3: 11
error_code = 1
Argument 4: 2
error_code = 1
Argument 5: elephants
error_code = 1
Argument 6: cavorting
error_code = 1

您的代码不包含用于打印从套接字读取的缓冲区中的内容的诊断信息 - 您还没有向我们显示正在发送的内容。它也不能确保数据是以空字符结尾的字符串。

这表明问题更多的是在通过套接字读取的数据或调用此函数的代码中,而不是函数的主要部分。或者滥用isdigit()的代码导致代码失败。你是否忽略编译警告?如果您的编译器没有告诉您错误使用了isdigit(),那么您需要打开更多警告,或者需要获得更好的编译器。如果您要验证令牌中的数字是否完整,则必须更加努力,并且可能使用strtol()strtod()或其中一位亲属(也许strtoimax())。