2

私はこのような構造の文字列をたくさん持っています

Trim(2714,8256)++Trim(10056,26448)++Trim(28248,49165)

そして、私がやりたいのは、すべての数値を配列に保存することです(この答えのために、1つの文字列の数値だけを保存したいとしましょう)。

私の計画は、すべての数字の最初の桁の位置を見つけて、sscanfで数字を読み取ることでしたが、それについて考えた限り、適切な方法を見つけることができませんでした。strstrについてはよく読んだことがありますが、文字列を別の文字列に検索するために使用されるため、正確な数を検索するか、0から9までをカバーする10のケースを実行する必要があります。

よろしくお願いします!

4

5 に答える 5

3

あなたはこのようなことを試すことができます:

  • 最初の桁が見つかるまで文字列を歩きます(使用isdigit
  • strtoulその位置から始まる番号を抽出するために 使用します
    • strtoul数値を返します
    • 2番目の引数( )は、抽出された数値に続く、endptr文字列内の次の文字を指します
  • すすぎ、繰り返します

または、(を使用して)文字列をトークン化"(,+)"し、すべてを試すこともできstrtoulます。

于 2012-07-29T09:39:13.297 に答える
3
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
  int arr[10], idx=0, d, l=0;
  char *p, *str = "Trim(2714,8256)++Trim(10056,26448)++Trim(28248,49165)";
  for (p = str; *p != 0; p+=l) {
    l = 1;
    if (isdigit(*p)){
      sscanf(p, "%d%n", &d, &l);
      arr[idx++] = d;
    }   
  }   
  for (l=0; l<idx; l++) {
    printf("%d\n", arr[l]);
  }
  return 0;
}
于 2012-07-29T10:01:22.410 に答える
0

YACCまたはLexを使用して、文字列を自由にフォーマットすることもできます。

于 2012-07-29T10:36:38.627 に答える
0

これが私がコードについてどう考えるかです:

  • ソース配列文字のループを開始します
    • (ソース配列の)現在の位置にある文字が数字の場合
    • それを宛先アレイにコピーします(宛先アレイの現在の位置にあります)
    • 宛先配列の次の位置に移動します
    • ソース配列の次の位置に移動します
    • ソース文字列の終わりに達した場合は、ループを終了します
  • 宛先文字列が正しく終了していることを確認してください(つまり、「\ 0」によって)

1つはループの反復ごとにインクリメントするソース配列用で、もう1つは宛先アレイ用であり、数字が見つかった場合にのみインクリメントする2つの異なるカウンターでカウントしていることに注意してください。

文字が数字であるかどうかのチェックは、関数「isdigit()」を使用して実行できますが、ヘッダーファイルctype.hが必要になります。

文字が数字であるかどうかを確認する別の方法は、ASCIIテーブルを参照してその値を確認することです。文字「0」は48に等しく、文字「9」は57に等しい。したがって、文字がその範囲内にある場合は数字であり、そうでない場合はキャラクターです。実際にキャラクターと直接比較することができます。

if (character >= '0' && character =< '9') printf("%c is a digit", character);
于 2012-07-29T14:06:42.133 に答える
0
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
  int array[8], count=0, data;
  const char *s = "Trim(+2714,8256)++Trim(10056,26448)++Trim(28248,49165)";
  char *p;
  while(*s) {
    if(isdigit(*s) || *s=='-' && isdigit(s[1])){
      data = strtol(s, &p, 10);
      s = p;
      array[count++] = data;
    } else
        ++s;
  }
  {//test print
    int i;
    for(i=0;i<count;++i)
      printf("%d\n", array[i]);
  }
  return 0;
}
于 2012-07-29T17:02:41.913 に答える