c - 为什么没有将 NULL 分配给我的指针数组?
问题描述
我有这个 C 程序,其中*args
数组中的最后一个位置必须为 NULL。NULL 没有被分配或打印?是因为"%s"
不适用于NULL吗?
在下面的程序中,我拆分用户输入的字符串并将每个标记分配给*args
指针数组。最后一个元素应为 NULL。
解决方案
如上所述,您不计算 NULL(除非它是第一个;错误),因此这意味着 args[counter -1] 将是您打印它时的最后一个非 NULL 条目。以下是我修复的一些问题:
- 用中断替换了运行标志,从而消除了包括 stdbool 在内的需要
- args 会溢出
- 在退出时做大量工作是没有意义的,所以在输入后将其移到右侧
- 简化 strtok 调用,如果第一次调用返回 NULL,则修复缺陷
- 美化输出,包括将消息“最后一个字符”更改为“最后一个字符串”。
- 用定义替换了 81 的两个魔法值。
还有一些问题没有解决:
- 您同时使用终止 null 和对 args 中大量元素的计数器。选择一个或另一个。
- scanf 会发生缓冲区溢出,将其替换为 fgets() 并对输入进行后处理以获得格式字符串的结果。
- scanf("%[^\n]%*c", 输入); 当输入为“\n”时无法读取任何内容。它也没有宽度限制(@chux-ReinstateMonica)。
#include <stdio.h>
#include <string.h>
#define MAX_INPUT 81
#define MAX_ARGS 81
int main() {
for(;;) {
char input[MAX_INPUT];
scanf("%[^\n]%*c", input);
if(!strcmp(input, "Exit")) break;
int counter = 0;
char *token;
char *args[MAX_ARGS];
do {
token = strtok(counter ? NULL : input, " ");
args[counter] = token;
if(token) counter++;
} while(token && counter < MAX_ARGS);
if(counter == MAX_ARGS) {
counter--;
args[counter] = NULL;
}
printf("\nlast string: %s\n", args[counter - 1]);
for(unsigned i=0; i < counter; i++) {
printf("%d %s\n", i, args[i]);
}
printf("\n");
}
return 0;
}
推荐阅读
- spring-boot - mongo 中是否有像 hibernate.showSql 这样的功能来跟踪 mongodb 中的查询执行
- node.js - Facebook 营销 API 不适用于 App 令牌?
- visual-studio-code - 带有 VSCode 的 Eslint 插件找不到插件
- mariadb - Mysql 表排序规则改变
- reactjs - 按下按钮时如何使数字对应的图像显示而不是数字?
- mysql - 如何在一条记录中获取不同记录的两个字段Mysql
- c# - 反序列化 JSON 字符串列表以找到正确的模型
- queue - FlowFiles 卡在 NiFi 集群的队列中
- javascript - 为什么使用fabricjs 导出时图像质量非常低?
- ios - 动态添加的类不会快速响应