我一直在嘗試使用 chatGPT 提示在 C 中進行程式設計。
使用增量提示可以讓 chatGPT 3.5 做比預期更多的事情。
我想知道程式碼質量,並且希望獲得有關提示和程式碼的回饋。
線程安全代碼
靜態路徑
較大路徑字串的動態路徑分配
Linux / MacOs 的標準做法是動態分配(4095 / 1024 圖表路徑限制),而 Windows(260 路徑限制)是靜態分配。
我逐步建立查詢,否則 chatGPT 往往會忘記先前的請求變更。
最後,這看起來像是某種原始形式的元編碼,可以強制 LLM 產生所需的程式碼。
_query LLM perplexity.ai Modify code example Portable Path Parsing and Validation Code in C use thread safe function use function pointer strtok_s() for Windows strtok_r() for linux allocate INITIAL_BUFFER_SIZE 60 char static path_copy declare pointer pfinal_path_copy initialize to path_copy when necessary dynamically allocate final_path_copy pfinal_path_copy = final_path_copy use single strcpy(pfinal_path_copy, path) function
程式碼一次成形一個功能以符合所需的風格
modify example replace 60 by equate
有些提示仍然黏著而沒有重複。早期添加了“no WSL cygwin”以提示輸入 Windows 作業系統特定代碼,然後被刪除。
write code example parse path in portable way linux windows MacOS no WSL cygwin
產生的程式碼會在第一次編譯並執行。
#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _WIN32 #include <io.h> // For _access() on Windows #include <windows.h> // For Windows API #else #include <unistd.h> // For access() on Unix-like systems (Linux, macOS) #include <sys/stat.h> #endif // Define a constant for the initial buffer size #define INITIAL_BUFFER_SIZE 60 // Function to check if a path is valid int path_validate(const char *path) { #ifdef _WIN32 return _access(path, 0) == 0; // 0 means the file exists #else struct stat buffer; return (stat(path, &buffer) == 0); // Returns 1 if valid, 0 if invalid #endif } // Type definition for tokenization function pointer typedef char* (*tokenizer_func)(char*, const char*, char**); // Function to parse the path into components void parse_path(const char *path) { char path_copy[INITIAL_BUFFER_SIZE]; // Static buffer for initial use char *final_path_copy = NULL; // Pointer for dynamic allocation char *pfinal_path_copy = path_copy; // Pointer to point to either path_copy or final_path_copy // Check if the input path length exceeds INITIAL_BUFFER_SIZE if (strlen(path) + 1 > INITIAL_BUFFER_SIZE) { final_path_copy = malloc(strlen(path) + 1); // Dynamically allocate memory if (final_path_copy == NULL) { fprintf(stderr, "Memory allocation failed.\n"); exit(EXIT_FAILURE); } pfinal_path_copy = final_path_copy; // Point to dynamically allocated memory } // Use a single strcpy function to copy the path into the appropriate buffer strcpy(pfinal_path_copy, path); // Copy full path into the selected buffer // Determine the separator based on the platform and assign the tokenizer function const char *separator; tokenizer_func tokenizer; char *saveptr; #ifdef _WIN32 separator = "\"; tokenizer = strtok_s; // Use strtok_s for Windows #else separator = "/"; tokenizer = strtok_r; // Use strtok_r for Linux #endif // Tokenize using the assigned tokenizer function char *token = tokenizer(pfinal_path_copy, separator, &saveptr); while (token != NULL) { printf("Path component: %s\n", token); token = tokenizer(NULL, separator, &saveptr); // Continue tokenizing } free(final_path_copy); // Free dynamically allocated memory after use (if allocated) } int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s <path>\n", argv[0]); return EXIT_FAILURE; } const char *path = argv[1]; // Validate the path using the new function name if (path_validate(path)) { printf("The path '%s' is valid.\n", path); printf("Parsing components:\n"); parse_path(path); } else { printf("The path '%s' is invalid.\n", path); } return EXIT_SUCCESS; } ## Unit test Was created but not included here ## Performance The entire exercise took 2:30 hour. I have not tested the code on Windows or MacOS. I'd like some feedback on code quality.
以上是chatGPT - C 程式設計 Linux Windows 跨平台 - 程式碼審查請求的詳細內容。更多資訊請關注PHP中文網其他相關文章!