为什么我的程序不显示每个输出? 2次迭代后停止

Why isn't my program displaying every output? It stops after 2 iterations

读取至少 3 个或更多命令行参数的应用程序, 其中每个参数都由服务器名和端口号 (0-1023) 对组成 以冒号隔开。您需要解析,提​​取和显示所有服务器名称 和端口号。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_RANGE 1023
    #define MAX_LENGTH 30
    #define DELIMITER ":"
    
/*
Validate every word received. It should contain a Server name and a port number in range 0-1023  Use isalpha(), isdigit() to validate 
server name and port numbers
 */

    int validateInputs(char *input){
        
        char *serverName = NULL;
        char *portNumber = NULL;
        char token[MAX_LENGTH];
        int portNo;
        int flag1 = 1;
        int flag2 = 1;
        int i;
        int serverLen;
        int portLen;
        
        strcpy(token,input);
        
        serverName = strtok(token, DELIMITER);
        portNumber = strtok(NULL, DELIMITER);
            
        serverLen = strlen(serverName);
        portLen = strlen(portNumber);
        
        for(i = 0; i < serverLen; i++){
            if(!isalpha(serverName[i])){
                flag1 = 0;
                break;
            }
        }
        
        for(i = 0; i < portLen; i++){
            if(!isdigit(portNumber[i])){
                flag2 = 0;
                break;
            }
        }
        
        if(flag1 && flag2){
            if(atoi(portNumber)>0 && atoi(portNumber)<=MAX_RANGE){
                return (EXIT_SUCCESS);
            }
        }
        return(EXIT_FAILURE);
    }

/*
function to receive a word, to extract and display server name and port number. Should store and return pointer to the server name
*/
    
    char* displayServerPort(char *input){
        
        char token[MAX_LENGTH];
        char *serverName = NULL;
        char *portNumber = NULL;
        char *name = NULL;
        int serverLen;
        
        strcpy(token,input);
        
        serverName = strtok(token, DELIMITER);
        portNumber = strtok(NULL, DELIMITER);
        
        printf("Server Name: %s\t Port No: %s\n", serverName, portNumber);
        
        serverLen = strlen(serverName);
        name = (char*) malloc (serverLen * sizeof(char));
        strcpy(name, serverName);
        
        return name;
    }
    
    int main(int argc, char *argv[]){
        
        int i, value;
        
        char *serverNames[MAX_LENGTH];
        char *name = NULL;
        char str[MAX_LENGTH];
        
        if(argc < 3){
            printf("Less number of arguments! Pass atleast 3 arguments");
            exit(EXIT_FAILURE);     
        }
        
        for(i = 1; i < argc; i++){
            
            value = validateInputs(argv[i]);
            if(value == 1){
                exit(EXIT_FAILURE);
            }
            name = displayServerPort(argv[i]);
            strcpy(serverNames[i],name);
        }
    
        return 0;   
    }

如果我将输入作为 服务器A-01 服务器B-02 服务器C-03 显示功能仅适用于第一个两个参数(serverA 和 serverB)。调试时我可以看到所有 3 个输出,但是当 运行 代码只显示第一个和两个参数时。

您的代码有两个问题:

  1. displayPortServer 中,您没有为 name 分配足够的 space。 strlen 在长度中包含 NUL 终止符,但 strcpy 会自动在末尾添加一个,写入超出缓冲区大小一,调用undefined behavior。您需要 malloc strlen + 1 字节,以便为终结符留出足够的空间:
name = malloc(serverLen + 1);

还有几点:

  • It's not necessary to cast the return value of malloc
  • sizeof(char) 被定义为 1,因此您可以安全地省略乘法。
  1. strcpy(serverNames[i],name); 不正确。 serverNames 定义为 char 指针数组。但是,您永远不会初始化这些指针,因此它们不会指向任何有效的内存,并且将数据写入您不拥有的某个随机内存地址也会调用未定义的行为。这里最简单的解决方法是简单地将 name 分配给该指针,因为您正在 mallocing 并在 displayPortServer:
  2. 中返回它
name = displayServerPort(argv[i]);
serverNames[i] = name;

这是一个 working demonstration,但正如警告所说,您实际上并没有使用 serverNames。当你完成后,你还应该 freeserverNames 中分配的所有字符串,或者记下当进程终止时你会让 OS 回收内存。

另外,您的测试输入可能有问题。您的代码指定服务器名称必须包含字母字符 only,因此对于像“serverA-01”这样的服务器名称,它一看到 '-' 就会失效,而您的程序将 exit(EXIT_FAILURE).