2017-11-02 16 views
0

私のプログラムでいくつかのテストをしていましたが、私の関数を入力するときにプログラムがクラッシュする理由が不思議でした。私のツールを手元に使う方法を理解しているかどうかを確認する段階にあったので、プログラムのロジックに気にしないでください。どのような構文がchar配列とそのポインタに関して欠けているのですか

#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++; 
    } 
} 

ありがとうございます。

+0

「A」、「Z」、「0」などの代わりに「65」や「90」などの数字を使用する理由は何ですか? – trentcl

+0

なぜあなたは 'strcpy'を1文字にしようとしていますか? –

+0

@ M.M私が言ったように、手元の問題以外は何も気にしないでください。私が欲しいものを見つけようとしていて、本当にテストしただけです。問題を置くすべては、ハハを投稿する前にコメントアウトされていた。 –

答えて

0
char *code, warehouse, product, qualifiers; 
    int i = 0; 

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

、あなたがscanf呼び出しを行うと、あなたのプログラムがまずいされるようcodeがメモリに初期化されていないポインタです。他の

char *code, warehouse, product, qualifiers; 

ポインタのみがcodeでは、単一charだけです:

は、私はあなたが何かもっと

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

最大の配列サイズを避ける方法はありますか? :) –

+0

はい。 https://stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length。または、C++と文字列を使用します。 – QuestionC

+0

@MikeLundAndersenまた、mallocを使用してスタックの代わりにヒープに配列を配置することもできます。 – vicatcu

0

codeにはメモリが割り当てられていないためです。初期化されていないポインタです。代わりにこれを試してみてください:ここで

// ... 
char myString[16], *code, warehouse, product, qualifiers; 
code = &myString[0]; 
int i = 0; 

printf("Enter a MMOC product code: "); 
scanf("%15s", code); 
// ... 
+0

バッファオーバーフローを避けるには、scanf形式の文字列に長さリミッタを使用する必要があります。 –

+0

'code'は' NULL'ではなく、初期化されていません。 – Barmar

1

まず同じように、これはあなたがやりたいことはありませんしたいと思います。 printfを文字列として印刷し、warehouseproductoutputArrayとして使用しています。ポインタ(または配列)である必要があります。

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

次にメモリが必要です。ポインタはまだ初期化されていないので、それらからの読み込みは未定義の動作です。

自動保存期間(スタック上)または動的(ヒープ上)のどちらかでメモリを割り当てることができます。

スタック:

char codestr[100]; 
code = codestr; 

が、その後は、あなたはまた、単に2つの変数を持つことを避けるために

char code[100]; 

としてcodeを宣言した可能性があります。

あなたが動的にメモリを割り当てたい場合は、あなたがmallocを使用します。

code = malloc(100); 

再びメモリを解放することを忘れないでください:

free(code); 

warehouseproductqualifiersすべてのメモリを必要としますあまりにも。定義された定数からいくつかの配列サイズを推測することができます。

関連する問題