2016-09-29 3 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] = 'а' и В = 5 (в "ABC" плюс последние два пробела). Я хочу считать первые три пробела, как мне это сделать?

+0

Объясните, что делает ваш 'scanf' строка кода. –

+0

'int spaces; scanf ("% n% [^ \ n]", & spaces, a); ' – BLUEPIXY

+0

Используйте'% [] 'для чтения последовательности пробелов. – Barmar

ответ

2

Вы можете просто прочитать всю строку, используя fgets(), вместо scanf(), которая обычно пропускает пробелы, если вы явно не захватили ее.

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()' тем, что 'scanf()' предназначен для синтаксического анализа определенных входов, тогда как 'fgets()' предназначен для чтения всей строки из входного потока. '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'; 
} 
Смежные вопросы