【问题标题】:What syntax am i missing out on regarding char arrays and pointers to them关于 char 数组和指向它们的指针,我错过了什么语法
【发布时间】:2017-11-02 00:54:22
【问题描述】:

我正在对我的一个程序进行一些测试,并且想知道为什么程序在进入我的函数时会崩溃。不要介意程序的逻辑,因为我仍处于确保我了解如何使用我手头的工具的阶段。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Constants */
#define HEX_CAPITAL_LETTERS_BEGIN 65
#define HEX_CAPITAL_LETTERS_END 90
#define HEX_NUMBERS_BEGIN 48
#define HEX_NUMBERS_END 57
#define EXIT_SUCCES 0

/* Prototypes */
void codeToField(char *charArray, int i, int hexFloor, int hexCeil, char *outputArray);

/* Main Function */
int main(void) {
  char *code, warehouse, product, qualifiers;
  int i = 0;

  printf("Enter a MMOC product code: ");
  scanf("%s", &code);

  codeToField(code, i, HEX_CAPITAL_LETTERS_BEGIN, HEX_CAPITAL_LETTERS_END, &warehouse);
  codeToField(code, i , HEX_NUMBERS_BEGIN, HEX_NUMBERS_END, &product);

  strcpy(&qualifiers, code + i);

  printf("\n\nWarehouse: %s\nProduct: %s\nQualifiers: %s\n", &warehouse, &product, &qualifiers);

  return EXIT_SUCCES;
}

void codeToField(char *charArray, int i, int hexFloor, int hexCeil, char *outputArray) {
  int j = 0;
  while (charArray[i] >= hexFloor && charArray[i] <= hexCeil) {
    outputArray[j] = charArray[i];
    i++;
    j++;
  }
}

提前致谢。

【问题讨论】:

  • 为什么使用6590之类的数字而不是'A''Z''0'等?
  • 你为什么要把strcpy变成一个字符?
  • @M.M 正如我所说,除了手头的问题,别介意。仍在试图找出我想要的东西,并且真的只是测试了一些东西。发帖前把问题都注释掉了哈哈。

标签: c arrays pointers syntax char


【解决方案1】:

首先,这不是你想要的:

char *code, warehouse, product, qualifiers;

唯一的指针是code,其他只是一个char。您将它们打印为带有printf 的字符串,并在您的函数中使用warehouseproduct 作为outputArray。它们也需要是指针(或数组):

char *code, *warehouse, *product, *qualifiers;

那么你需要内存。指针仍未初始化,因此从它们中读取的任何内容都是未定义的行为。

您可以使用自动存储持续时间(在堆栈上)或动态(在堆上)分配内存。

堆栈:

char codestr[100];
code = codestr;

但是,您也可以将code 声明为

char code[100];

避免有两个变量。

如果你想动态分配内存,你可以使用malloc:

code = malloc(100);

别忘了再次释放内存:

free(code);

warehouseproductqualifiers 也都需要内存。一些数组大小可以从定义的常量中推导出来。

【讨论】:

    【解决方案2】:
      char *code, warehouse, product, qualifiers;
      int i = 0;
    
      printf("Enter a MMOC product code: ");
      scanf("%s", &code);
    

    这里,code 是一个未初始化的内存指针,所以一旦你调用了scanf,你的程序就会被破坏。

    我想你想要的东西更像

    char code[100];
    printf ("Enter a MMOC product code: ");
    scanf ("%s", code);
    

    【讨论】:

    • 有没有办法避免最大数组大小? :)
    • 是的。 stackoverflow.com/questions/16870485/…。或者只使用 C++ 和字符串。
    • @MikeLundAndersen 您还可以使用 malloc 将您的数组放在堆上而不是堆栈上..
    • @vicatcu 是的,但你仍然需要最大尺寸
    【解决方案3】:

    原因是code 没有分配内存。它是一个未初始化的指针。试试这个:

    // ...
    char myString[16], *code, warehouse, product, qualifiers;
    code = &myString[0];
    int i = 0;
    
    printf("Enter a MMOC product code: ");
    scanf("%15s", code);
    // ...
    

    【讨论】:

    • 您应该在 scanf 格式字符串中使用长度限制器以避免缓冲区溢出
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 2018-04-05
    • 2021-01-26
    • 2017-09-03
    • 1970-01-01
    • 2016-01-27
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多