【问题标题】:String from command prompt来自命令提示符的字符串
【发布时间】:2016-10-06 01:45:08
【问题描述】:

我正在尝试使用命令提示符传递我的参数。

有 可以将 3 种不同的类型传递给我的程序:int、char、string。它适用于整数和字符,但如果我传递字符串,我会遇到段错误。

#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "MergeSort.h"


int main(int argc, char *argv[])
{
if (argc > 2){
    if (strcmp(argv[1], "int") == 0){
        cmp_t cmp = CompareInt;
        int arr[argc - 2];
        for(int i = 2; i < argc; i++) sscanf (argv[i], "%d", &arr[i - 2]);;
        merge_sort(arr,  argc - 2, sizeof(int), cmp);
        for(int i = 0; i < argc - 2; i++) printf("%i ", arr[i]);
    }
    else if(strcmp(argv[1], "char") == 0){
        cmp_t cmp = CompareChar;
        char arr[argc - 2];
        for(int i = 2; i < argc; i++) sscanf (argv[i], "%c", &arr[i - 2]);;
        merge_sort(arr,  argc - 2, sizeof(char), cmp);
        for(int i = 0; i < argc - 2; i++) printf("%c ", arr[i]);
    }
    else{
        cmp_t cmp = CompareStr;
        char* arr[argc - 2];
        for(int i = 2; i < argc; i++) sscanf (argv[i], "%s", arr[i - 2]);
        merge_sort(arr,  argc - 2, sizeof(char*), cmp);
        for(int i = 0; i < argc - 2; i++) printf("%s ",arr[i]);
    }
}
return 0;
}

【问题讨论】:

  • 您没有为字符串分配存储空间。你只是使用了原始的、未初始化的指针并开始写入它们指向的任何随机位置。
  • 当您单步执行该部分代码时,调试器会向您显示什么?
  • char* arr[argc - 2];。需要为每个字符串分配内存。这些元素中的每一个都是当前未初始化的指针。 sscanf 不会为你分配内存。
  • 或者,您可以只存储argv 中已经可用的指针,而无需分配或复制字符串。
  • 不,请不要在我们在这里的时候把这样的问题串起来。接受那个建议,去学习,如果你有困难再回来。因为即使我们帮助您处理字符串,您接下来要问的是为什么合并排序不起作用,我们会说这是因为您需要 cmp 函数的字符串版本,而您'我会问“我该怎么做”,然后我们就兜兜转转。

标签: c string function command-line


【解决方案1】:

我可以简单地将指针从argv 复制到arr,例如:arr[i-2] = argv[i];

第二种方式是为字符串分配内存。

【讨论】: