0

次の変数を宣言しました

char min[6] = "";
char max[6] = "";
char hr[6] = "";
char div[6] = "";
char vol[6] = "";

次のコードでは、strtok でいくつかのトークンを取得します

if (pos)
    {

         ptr = strtok(buff, "Nodo_,=:V()");
         i = 0;
       while (ptr != NULL)
         {
          if (i == 0)
             strcat(min, ptr); 
          if (i == 2)
             strcat(tmax, ptr); 
          if (i == 4)
             strcat(hr, ptr); 
          if (i == 6)
             strcat(div, ptr);
          if (i == 8)
             strcat(vol, ptr); 

          ptr = strtok(NULL, "Nodo_,=:V()");
          i++;
         }
      printf("Results: %s, %s, %s, %s, %s\n", min, max, hr, div, vol);

結果は次のようになります

Results: 4, 23, 45, 67, 89

次のことを行うifステートメントを作成したいと思います(sは現地時間です)

char *table1[10] = {0};
        if(*min == "4")
        {
        table1[5]=min;
        table1[6]=max;
        table1[7]=hr;
        table1[8]=div;
        table1[9]=vol;
        fprintf(ft,"%s   %d   %d   %d   %d   %s   %s   %s   %s   %s",s,table1[0],table1[1],table1[2],table1[3],table1[5],table1[6],table1[7],table1[8],table1[9]);
        }
        else
        {
        table1[0]=min;
        table1[1]=max;
        table1[2]=hr;
        table1[3]=div;
        table1[4]=vol;
        fprintf(ft,"%s   %s   %s   %s   %s   %d   %d   %d   %d   %d",s,table1[0],table1[1],table1[2],table1[3],table1[5],table1[6],table1[7],table1[8],table1[9]);

        }

問題は、値 4 と比較する if ステートメントの書き方がわからないことです。さまざまな方法を使用しましたが、常に ELSE のみで結果が得られます。

if(*min == "4")
if(*min == '4')
if(&min == "4")
   etc.

次に、私が持っているこのひどい fprintf を書くためのより良い方法を提案してもらえますか? 私は自分の結果をこのようにしたいので:

0 0 0 0 4 23 45 67 89

また

5 23 45 67 89 0 0 0 0  
4

4 に答える 4

0

比較するには、char* を比較しているため、strcmp または strncmp を使用する必要があります。min の最初の文字の ascii 値を比較しようとしているので*min、そうするべきではありません。1 桁で比較しようとしている場合は問題ありませんが、複数の桁で数値を比較しようとしている場合はうまくいきません。minchar**min == "4"(*min == min[0])

次に、良い方法で表示するには、NULL を表示しようとしているので %d を使用して 0 を表示しないでください。

for (int i = 0; i < 10; i++)
{
 if (table1[i] == NULL)
   fprintf(ft, "0 ");
else
   fprintf(ft, "%s ", table1[i]);
}
fprintf(ft, "\n");

タブを埋めるときは、(strtokのループで)次のようなことを試すことができます

 while (ptr != NULL)
     {
       if (i%2 == 0)
         tab1[i / 2] = strdup(ptr); //don't forget to free at the end ;)
       i++;
     }

ただし、数値のみを操作する場合は、単純なint*( int tab1[10]) を使用して、次のように入力できます。atoi

 while (ptr != NULL)
     {
       if (i%2 == 0)
         tab1[i / 2] = atoi(ptr); //
       i++;
     }

この場合、数値と直接比較して直接行うことができます

if (tab1[i] == 4)
 ...
于 2013-06-21T10:04:51.663 に答える
0

strcmpまたはstrncmpを使用し、引数は char* であるため、たとえば if (strcmp(min,"4") ==0) を作成する必要があります

string.h を含める必要があることに注意してください( strcat を使用するためにこれを行ったと思います)

PS: table1[5]=min; などの行 Table1[5] が char で min が char* であるため、機能しません。

于 2013-06-21T09:53:08.273 に答える
0

C の文字列は実際には文字の配列であり、C のすべての配列変数はポインターであるため、スタイルの比較を行うと、定数文字列の*min == "4"最初の位置に含まれるものを実際に比較することになります。与えられた。min"4"

文字列比較を実行するには、その目的のために意図された関数strcmpを使用する必要があります。

出力をよりきれいに印刷する方法が必要な場合は、結果の文字列をchar **配列に保存してから、forループを使用してそれらを印刷できます。

于 2013-06-21T07:56:59.460 に答える
0

あなたのコードにはいくつかの問題があります。

1位。控えめに言っても、非常に危険な方法で文字列を比較しています。いくつかの奇妙なケースで機能する可能性があります。一般的に、それは間違っていると考えるべきです。のようなc適切な関数を使用する必要があります。strcmp

2番目。あなたの s は、フォーマット文字列 (または)fprintf(...)の予想される型を除いて、まったく同じように見えます。ただし、の種類は変わりません!間違った指定子を使用すると、異常な出力が観察されたり、見つけにくいメモリ バグが発生したりする可能性があります。私には、常に使用する必要があるように見えます。オールタイプなので。また、印刷を簡素化するために、単純なループを使用できると思います。%s%dtable1%schar*for

3番目。1 つのパスで 2 つのブランチを実行することはないため、をより適切な、または少なくともifに切り替えることができます。ただし、全体的なロジックを変更しないため、それほど重要ではありません。状況によっては、パフォーマンスが重要になる可能性があります。caseif else

編集:

OK、あなたifは2つの方法で書くことができます.

char *table[10] = {0};これにより、10 個の文字列へのポインターのテーブルが作成されます。実際に文字を保持するには、さらにスペースを確保する必要があります。また、のスロット 5 にtable1[5]=min;文字列を入れたりコピーしたりしません。や と同じ間違いです。で文字列を操作するための短い紹介/チュートリアルを読む必要があります。mintable1==strcmpc

次のようなものが必要になります。

char *table[10] = {0}; //create a table with pointers to 10 "strings"
size_t MAX_STR_SIZE = 6; // I assumed this from your example code.
for(int i = 0; i < 10; ++i){
  table[i] = malloc(MAX_STR_SIZE); //allocate space for string
  //initialize
  table[i][0] = '0';  //put '0' into as 1st char
  table[i][1] = '\0'; //put null character at 2nd space 

  //table[i][0] = '\0'; // You can use this line or the one below this to initialize it
  //table[i][0] = 0;    // to a nullstring like you did in your 1st code snippet
}

それからあなたはあなたのifに行くことができます

if(strcmp(min,"4") == 0)
{
  strcpy(table[5], min); //This is how you copy null terminated strings in `c`.
  strcpy(table[6], max); 
  strcpy(table[7], hr);
  //...
} else {...}
fprintf(ft,"%s  ", s);
for(int i = 0; i < 10; ++ 1) fprintf(ft,"%s  ", table[i]);

これですべてのコードが再現されるわけではありませんが、単純な下り坂しかできないところまで到達するはずです。

EDIT2:

などの使用は避けたいと思いmin,max、テーブルに切り替えただけです。私の悪い。もちろん、前に提案したように不要な文字列のコピーを避けるために、テーブルを使用してそれらのポインターを再利用することもできます。ただしtable[i]、適切な文字列への適切なポインタが常に含まれている必要があります。つまり、ヌルポインターではなく、ランダムなメモリガベージへのポインターでもありません。私は次のようなものを提案します:

char default_str[1] = ""; // or default_str[2] = "0" depending on your needs.
char *table[10] = {0}; //create a table with pointers to 10 "strings"
//...
if(*min == "4")
{
  table[0]=table[1]=table[2]=table[3]=table[4]=default_str;
  table[5]=min;
  table[6]=max;
  table[7]=hr;
  table[8]=div;
  table[9]=vol;
}
else
{
  table[5]=table[6]=table[7]=table[8]=table[9]=default_str;
  table[0]=min;
  table[1]=max;
  table[2]=hr;
  table[3]=div;
  table[4]=vol;
}
fprintf(ft,"%s  ", s);
for(int i = 0; i < 10; ++ 1) fprintf(ft,"%s  ", table[i]);

このようにして、未使用のポインターを設定して を参照しますdefault_strtableエントリが元の変数とメモリを「共有」するため、元のコードに近づくほどメモリの使用量が少なくなります。

おそらく を使用して、ブランチchar *table[10] = {default_str}内での再初期化をスキップすることもできますが、コンパイラがそれを許可するかどうかはわかりません。ifc

于 2013-06-21T07:58:28.367 に答える