C程序第二次循环后无法正确将用户名拼接到API URL问题排查
问题根因
你的代码存在3个核心错误,直接导致后续循环拼接失败:
- 循环变量
z、a未初始化:C语言局部变量声明时不会自动赋值为0,第一次循环时z可能恰好是随机值0,后续循环时z的初始值远大于UsernameSize,拼接用户名的循环直接不执行,自然不会更新URL后半段 fgets读取行时会将行尾的换行符\n一并读入Username,拼接后URL会携带无效换行符,调用接口时会报错- 硬编码前缀长度48非常容易出错,后续修改前缀URL时要重新计算长度,维护性极差
修复方案
可以直接用标准库的字符串拼接函数简化逻辑,避免手动操作索引出错,修复后代码如下:
#include <stdio.h> #include <string.h> int main() { const char API_PREFIX[] = "https://api.1234ng.com/users/profiles/planeraft/"; char username[255]; char request[255]; FILE* usernames_file = fopen("Usernames.text", "r"); // 先判断文件是否打开成功 if (usernames_file == NULL) { printf("无法打开用户名文件\n"); return 1; } int counter = 0; // 循环到读完100条或者文件读完为止 while (counter < 100 && fgets(username, sizeof(username), usernames_file) != NULL) { // 去掉fgets读入的末尾换行符 size_t len = strlen(username); if (len > 0 && username[len -1] == '\n') { username[len -1] = '\0'; } // 拼接生成完整请求地址 snprintf(request, sizeof(request), "%s%s", API_PREFIX, username); // 打印结果 printf("%s\n", request); counter++; } fclose(usernames_file); return 0; }
补充说明
- 用
snprintf做字符串拼接,自动处理结尾的\0,不需要手动清空旧的拼接内容,也不会溢出缓冲区 - 主动去掉用户名末尾的换行符,保证URL合法性
- 增加文件打开失败判断、文件读取结束判断,避免程序异常崩溃
内容的提问来源于stack exchange,提问作者sumfoxdude
相关产品推荐
相关产品推荐

