2

いくつかの文字と数字で構成される char 配列を作成しようとしています (関数は最初はもっと複雑でしたが、正しく機能しない理由を理解するために単純化を続けました)。だから私は2文字を入れたchar配列を持っていて、それにいくつかの数字を追加しようとしています。私が理解できない理由で、数字は配列に追加されません。本当にばかげているかもしれませんが、私は C に慣れていないので、簡略化したコードを示します。どんな助けでも大歓迎です、ありがとう!

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

char some_string[20];

char *make_str() {
  some_string[0] = 'a';
  some_string[1] = 'x';
  int random = 0;
  int rand_copy = 0;
  random = (rand());
  rand_copy = random;
  int count = 2;
  while ( rand_copy > 0 ) {
    rand_copy = rand_copy / 10;
    ++count;
  }
  int i=2;
  for (i=2; i<count; i++) {
    some_string[i] = random%10;
    random = random/10;
  }
  return (some_string);
}    

int main(int argc, const char *argv[]) {
  printf("the string is: %s\n",make_str());
  return 0;
}
4

1 に答える 1

2

あなたは多くの問題を抱えています:

  1. 結果の文字列はゼロで終了しません。some_string[i] = '\0';これを修正するために追加
  2. 文字(char)は「文字」のようなものですがrandom % 10、数字(int)を生成し、文字に変換すると制御コードになります(ASCII文字0〜9は制御コードです)。使用したほうがいいsome_string[i] = (random % 10) + '0';
  3. 固定長の文字列(20文字)を使用している場合はこれで十分かもしれませんが、多くの問題が発生する可能性があります。初心者で動的メモリ割り当てをまだ習得していない場合は、今のところ問題ありません。ただし、固定長のバッファーは、バグのあるCコードの上位10の理由の1つであることを忘れないでください。また、固定長のバッファーを使用する必要がある場合(これを行う正当な理由があります)、常にバッファーをオーバーランしていないかどうかを確認します。バッファ長には事前定義された定数を使用します。
  4. snprintf演習の目的が数値を文字列に変換することでない限り、何かを文字列に出力する場合と同様にlibc関数を使用してください。
  5. グローバル変数()を使用しないでください。使用するsome_string場合(小さな例では問題ありません)、この値を返す意味はありません。

少し良いバージョン:

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

#define BUF_LENGTH 20
char some_string[BUF_LENGTH];

char *make_str() {
    some_string[0] = 'a';
    some_string[1] = 'x';
    int random = rand();
    int rand_copy = random;
    int count = 2;
    while (rand_copy > 0) {
        rand_copy = rand_copy / 10;
        ++count;
    }
    int i;
    for (i = 2; i < count; i++) {
        /* check for buffer overflow. -1 is for terminating zero */
        if (i >= BUF_LENGTH - 1) {
            printf("error\n");
            exit(EXIT_FAILURE);
        }
        some_string[i] = (random % 10) + '0';
        random = random / 10;
    }
    /* zero-terminate the string */
    some_string[i] = '\0';
    return some_string;
}    

int main(int argc, const char *argv[]) {
  printf("the string is: %s\n",make_str());
  return 0;
}
于 2012-08-23T11:49:49.827 に答える