-1

私は C プログラミングが初めてです。整数を配列で表すことにより、大きな整数の加算を実装するプログラムを作成していました。メインプログラムのいたるところにprintfを配置し、strrev部分が問題の原因であることがわかりました(明らかにメインプログラムではなく、エラー部分のみをここに配置しました。しかし、何が問題なのかわかりません。誰か助けてください私と同じ?

以下のコード-

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

struct integer
{
    char store[200];
    int length;
};
void printer2(struct integer x1);
int main()
{

struct integer x1;
x1.store[0]=1;
x1.store[1]=2;
x1.store[2]=3;
x1.store[3]=4;
x1.store[4]=5;
x1.length=5; 
printer2(x1);
strrev(x1.store);
printer2(x1);
return 0; 
}

void printer2(struct integer a1)
{
    int j;
    for (j=0;j<a1.length;j++)
    {
        printf("a1 %d is %d\n",j,a1.store[j]);
    }
};
4

2 に答える 2

1

AC 文字列は、charヌル ( '\0'\) 要素で終了する の配列です。このターミネータが配列にないためstrrev、最初のゼロバイトが見つかるまで読み取ります。または、プログラムがクラッシュします。

配列を文字列として扱いたい場合は、nul ターミネータを追加する必要があります

x1.store[5]='\0';

Jongware が指摘したように、配列要素を に設定する場合、このアプローチは失敗することに注意してください0。これらは、nul ターミネータとして誤って解釈されます。文字を出力する場合は、代わりに整数の文字コードが必要になる場合があります-、、'0'など'1'

余談ですが、次のような関数に注意してください

void printer2(struct integer a1)

の完全なコピーが渡されますa1。これが意図的でない場合は、代わりに呼び出し元のインスタンスのアドレスを渡すことを検討できます

void printer2(const struct integer* a1)

アドレス演算子を使用して呼び出されます&

printer2(&x1);
于 2013-08-03T14:34:49.977 に答える
0

この anwser は、上記の anwser の後にあります。私は提案をするだけです。

整数の数字を.Initializedcharのように保存できるかもしれません:

x1.store[0]='1';
x1.store[1]='2';
x1.store[2]='3';
x1.store[3]='4';
x1.store[4]='5';
x1.store[5]='\0'
x1.length=5; 

整数の桁を使用する場合。使用する int x1_store0 = x1.store[0] - '0';

于 2013-08-03T15:38:15.347 に答える