用于讀取至少 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;
}
如果我將輸入作為 serverA-01 serverB-02 serverC-03 輸入,則顯示功能僅適用于第一個兩個引數(serverA 和 serverB)。除錯時我可以看到所有 3 個輸出,但運行代碼時只顯示第一個兩個引數。
uj5u.com熱心網友回復:
您的代碼有兩個問題:
- 在
displayPortServer中,您沒有為 分配足夠的空間name。strlen長度中不包含 NUL 終止符,但會strcpy在末尾自動添加一個,將緩沖區的大小寫入 1,呼叫未定義的行為。您需要mallocstrlen 1位元組,以便為終結器提供足夠的空間:
name = malloc(serverLen 1);
關于這一點還有幾點:
- 沒有必要強制轉換的回傳值
malloc sizeof(char)被定義為一,所以你可以安全地省略乘法。
strcpy(serverNames[i],name);是不正確的。serverNames被定義為一個 char 指標陣列。但是,您永遠不會初始化這些指標,因此它們不會指向任何有效記憶體,并且將資料寫入您不擁有的某個隨機記憶體地址也會呼叫未定義的行為。這里最簡單的解決方法是簡單地分配name給該指標,因為您正在mallocing 并回傳它displayPortServer:
name = displayServerPort(argv[i]);
serverNames[i] = name;
這是一個作業演示,但正如警告所說,您實際上并沒有使用serverNames. 您還應該在完成free后將所有分配的字串放入其中serverNames,或者記下您將讓作業系統在行程終止時回收記憶體。
此外,您的測驗輸入可能有問題。您的代碼指定服務器名稱只能包含字母字符,因此對于像“serverA-01”這樣的服務器名稱,它一看到就失效'-',您的程式將exit(EXIT_FAILURE)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/431677.html
