掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26682

printf()が原因?
投稿者---makoko(2006/04/22 15:30:08)


COMMAND getCommand(char *c)
{
       int i, j, k, l, len;
       char comtmp[128], fileNametmp[128], comExtmp[128];
       COMMAND command;

       len = strlen(c);
       for(i=0; i<len+1; i++){
             if(c[i] == '-'){
                     for(j=0; c[i]!='\0'; j++){
                            i++;
                            if(c[i] == '@'){
                                   comtmp[j] = '\0';
                                   for(k=0; c[i]!='\0'; k++){
                                          i++;
                                          if(c[i] == '>'){
                                                 for(l=0; c[i]!='\0'; l++){
                                                        i++;
                                                        comExtmp[l] = c[i];
/*printf("\nc[%d] = %c\n", i, c[i]);*/
                                                 }
                                          }
                                          if(c[i] == '\0'){
                                                 comExtmp[k] = '\0';
                                                 command.com = malloc(sizeof(char)*(strlen(comtmp)+1));
                                                 command.fileName = malloc(sizeof(char)*(strlen(fileNametmp)+1));
                                                 command.comEx = malloc(sizeof(char)*(strlen(comExtmp)+1));
                                                 strcpy(command.com, comtmp);
                                                 strcpy(command.fileName, fileNametmp);
                                                 strcpy(command.comEx, comExtmp);

                                                 return command;
                                          }
                                          fileNametmp[k] = c[i];
                                   }
                            }else if(c[i]!='\0'){
                                   comtmp[j] = c[i];
                            }
                     }
              }else if(c[i]=='\0'){
                     break;
              }
       }

       command.com = NULL;
       command.fileName = NULL;
       command.comEx = NULL;

       return command;
}

質問です。
このプログラム、-xxxxxx@yyyyyy>zzzzzz  (x, y, z は不定)
という文字列から command.com = xxxxxx
            command.fileName = yyyyyy
            command.comEx = zzzzzzz
に文字列を分けて入れるプログラムです。
コメントアウトしてあるprintf()があるのはデバッグのためなのですが、printf()をコメントアウトするとバグが起こり、
コメントアウトしないでprintf()を出力するとバグが起こりません。なぜでしょうか?
どなたかよろしくお願いします。

-insert@123.bmp>rgb と入力した時、fileNameにstrlen()で文字列数を調べたところ、
printf()をコメントアウトしなかった場合、7文字と正確に入っていて。
コメントアウトした場合、11文字とでます。
コンパイラーはbccの5.5で、windowsXPを使用しています。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:printf()が原因? 26683 kz3 2006/04/22 16:33:54


No.26683

Re:printf()が原因?
投稿者---kz3(2006/04/22 16:33:54)


全角インデントはやめてください...
ちゃんと利用宣言に「ソースの添付は「HTML変換ツール」で字下げします。」
と書かれてありますから従いましょう。

>コメントアウトしてあるprintf()があるのはデバッグのためなのですが、printf()をコメントアウトするとバグが起こり、 
>コメントアウトしないでprintf()を出力するとバグが起こりません。なぜでしょうか?
>-insert@123.bmp>rgb と入力した時、fileNameにstrlen()で文字列数を調べたところ、 
>printf()をコメントアウトしなかった場合、7文字と正確に入っていて。 
>コメントアウトした場合、11文字とでます。 
>コンパイラーはbccの5.5で、windowsXPを使用しています。 

たまたまではないですか?
filenametmpがしっかりとヌルで完結していないように思います。
# 見間違えたかな...



この投稿にコメントする

削除パスワード

No.26684

Re:printf()が原因?
投稿者---kz3(2006/04/22 16:51:15)


> たまたまではないですか?

と言うだけというのも無責任なので

int main( void ){ COMMAND com; com = getCommand( "-insert@123.bmp>rgb" ); printf("%s\n", com.com); printf("%s\n", com.fileName); printf("%s\n", com.comEx); return 0; }
で実行確認してみましたが、 私の環境( WinXP SP2 + BCC5.5.1 )では「たまたま?」どちらも同じ実行結果で以下 insert 123.bmp rgb のようになりました。




この投稿にコメントする

削除パスワード

No.26690

Re:printf()が原因?
投稿者---wis(2006/04/23 09:58:21)


とりあえず、整形と修正?

#include <stdio.h>

#define FREE(p) if(p){ free(p); p=NULL; }

typedef struct _cmd_{
  char* com;
  char* fileName;
  char* comEx;
}COMMAND;

COMMAND getCommand(char *c) 
{ 
  int i, j, k, l, len; 
  char comtmp[128], fileNametmp[128], comExtmp[128]; 
  COMMAND command; 

  len = strlen(c); 
  for(i=0; i<len+1; i++){ 
    if(c[i] == '-'){ 
      for(j=0; c[i]!='\0'; j++){ 
        i++; 
        if(c[i] == '@'){ 
          comtmp[j] = '\0'; 
          for(k=0; c[i]!='\0'; k++){ 
            i++; 
            if(c[i] == '>'){ 
              for(l=0; c[i]!='\0'; l++){ 
                i++; 
                comExtmp[l] = c[i]; 
                printf("\nc[%d] = %c\n", i, c[i]); 
              } 
            } 
            if(c[i] == '\0'){ 
              fileNametmp[k] = '\0'; /* Point ? */
              command.com = (char*)malloc(sizeof(char)*(strlen(comtmp)+1)); 
              command.fileName = (char*)malloc(sizeof(char)*(strlen(fileNametmp)+1)); 
              command.comEx = (char*)malloc(sizeof(char)*(strlen(comExtmp)+1)); 

              strcpy(command.com, comtmp); 
              strcpy(command.fileName, fileNametmp); 
              strcpy(command.comEx, comExtmp); 

              return command; 
            }
            fileNametmp[k] = c[i];
          }
        }else if(c[i]!='\0'){ 
          comtmp[j] = c[i]; 
        } 
      } 
    }else if(c[i]=='\0'){ 
      break; 
    }
  } 

  command.com = NULL; 
  command.fileName = NULL; 
  command.comEx = NULL; 

  return command; 
} 


int main( void )
{
  COMMAND com;
    
  com = getCommand( "-insert@123.bmp>rgb" );
    
  printf("%s\n", com.com);
  printf("%s\n", com.fileName);
  printf("%s\n", com.comEx);

  FREE( com.com );
  FREE( com.fileName );
  FREE( com.comEx );

  return 0;
}

上位の解放責任を忘れずに。


この投稿にコメントする

削除パスワード

No.26689

Re:printf()が原因?
投稿者---kz3(2006/04/23 09:51:27)


>filenametmpがしっかりとヌルで完結していないように思います。
これは自分で意図的にヌルで完結させていない、という意味です。


for(l=0; c[i]!='\0'; l++){ i++; comExtmp[l] = c[i]; } } if(c[i] == '\0'){ comExtmp[k] = '\0';
この部分について、 comExtmpにはループ中にヌル文字が入ってから抜けるので、 改めて入れる必要はないと思います。 というか k はcomExtmpの末尾を指してはいません。 fileNametmp[ k ] = '\0'; の間違いではないでしょうか?




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧