首页 > 解决方案 > 为什么没有将 NULL 分配给我的指针数组?

问题描述

我有这个 C 程序,其中*args数组中的最后一个位置必须为 NULL。NULL 没有被分配或打印?是因为"%s"不适用于NULL吗?

在下面的程序中,我拆分用户输入的字符串并将每个标记分配给*args指针数组。最后一个元素应为 NULL。

标签: c

解决方案


如上所述,您不计算 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;
}

推荐阅读