2

私は次のコードを持っています:

scanf(" %Xs %Ys", buf1, buf2);

ここで、XとYは整数である必要があります。問題は、XとYの値がコンパイル時定数であり、値をフォーマット文字列にハードコーディングしたい場合でも、値がわからないためにできないことです。printfでは、「%* s」を使用して、引数とともに幅変数を送信できます。scanfに類似したものはありますか?

編集:明確にするために、定数はコンパイル時に知られていますが、コーディング時には知られておらず、私にはまったく知られていません。それらはプラットフォームや実装によって異なる場合があり、完了後に変更される場合があります。そうしなかったとしても、バッファサイズをフォーマット文字列で複製したくないので、同期を維持するのを忘れた瞬間にセグメンテーション違反を起こす準備ができています。

4

3 に答える 3

7

sprintf()を使用してフォーマット文字列を生成できます。

sprintf( format, " %%%is %%%is", X, Y );
scanf(format, buf1, buf2);

編集:素晴らしいですが、次のgccコードが機能しています:

#include <stdio.h> 

#define LIST(...) __VA_ARGS__ 

#define scanf_param( fmt, param, str, args ) {  \ 
  char fmt2[100]; \ 
  sprintf( fmt2, fmt, LIST param ); \ 
  sscanf( str, fmt2, LIST args  ); \ 
} 

enum { X=3 };
#define Y X+1 

int main(){
  char str1[10], str2[10];

  scanf_param( " %%%is %%%is", (X,Y), " 123 4567", (&str1, &str2) );

  printf("str1: '%s'   str2: '%s'\n", str1, str2 );
}
于 2009-10-11T05:27:45.690 に答える
4

問題は、XとYの値がコンパイル時定数であるということです

次に、マクロ貼り付け機能を使用します。

#include <stdio.h>

#define TEST 2

#define CONST_TO_STRING_(x) #x
#define CONST_TO_STRING(x) CONST_TO_STRING_(x)

int main() {
    printf("1 " CONST_TO_STRING(TEST) " 3\n");
    return 0;
}
于 2009-10-11T05:23:25.543 に答える
0

あなたの質問は明確ではありません。値がわからない場合は、コンパイル時の定数ではなく、実行時の定数である可能性があります。

そうである場合 (つまり、ランタイム定数である場合)、いいえ、「scanf」にはそのような機能はありません。できる唯一のことは、実行時に「sprintf」を使用して完全なフォーマット文字列 (具体的な値が埋め込まれた) を生成し、そのフォーマット文字列を「scanf」に渡すことです。

于 2009-10-11T06:35:27.100 に答える