2016-09-29 5 views
-1

私はこの単純な問題を抱えています。Cの先行スペースを維持する

int B; 
char *a = (char*)malloc(1000*sizeof(char); 

scanf("%[^\n]s", a); 
printf("%c\n", a[0]); 
B = strlen(a); 
printf("%d\n", B); 

私のようなエントリを置く場合:

" abc " 

[0] = 'A' とB = 5( "ABC" プラス最後の二つの空間)。私は最初の3つのスペースを数えたいと思いますが、どうすればいいですか?

+0

がコードのあなたの 'scanf'ラインが何をするのか説明してください。 –

+0

'intスペース。 scanf( "%n%[^ \ n]"、&spaces、a); ' – BLUEPIXY

+0

'%[] 'を使って一連のスペースを読み込みます。 – Barmar

答えて

2

scanf()ではなく、fgets()を使用して行全体を読むことができます。これは、明示的にキャプチャしない限り、一般に空白をスキップします。あなたが先頭にスペースをトリミングする場合

int B; 
char *a = malloc(1000 * sizeof*a); /* don't cast malloc */ 

if (fgets(a, 1000, stdin) == NULL) { 
    fputs("Could not read input\n", stdout); 
} 
else { 
    printf("%c\n", a[0]); 
    B = strlen(a); 
    printf("%d\n", B); 
} 
+0

を投稿してください。これはいくつかの問題を解決します。私はfgetsがstrlenカウントで空白を無視したと思った。 – Tricolor

+0

@Tricolor 'strlen()'は '\ 0'を終了するまでのすべての文字を数えます。その間にある文字はスキップしません。 'fgets()'は特定の入力を解析するために 'scanf()'が設計されているのに対し 'fgets()'は入力ストリームから行全体を読み込むように設計されている点で 'scanf()'とは異なります。 'scanf()'は選択時の文字列入力にのみ使用してください。さもなければ、 'fgets()'はおそらくあなたが必要とするものです。 –

0

、あなたはこれを試すことができます。

void trim_left(char *p); 
int main() 
{ 
    int B; 
    char *a = (char*)malloc(1000*sizeof(char)); 

    scanf("%[^\n]s", a); 
    printf("%c\n", a[0]); 
    trim_left(a); 
    B = strlen(a); 
    printf("%d\n", B); 
    printf("a = %s\n", a); 
    return 0; 
} 

void trim_left(char *p) { 
    int i = 0; 
    while (p[i] && isspace(p[i])) { 
    i++; 
    } 
    memmove(p, p+i, strlen(p+i)); 
    p[strlen(p+i)] = '\0'; 
} 
関連する問題