保持C中的前导空间

保持C中的前导空间,c,string,C,String,我有一个我无法克服的简单问题 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 " a[0]=“a”和B=5(“abc”加上最后两个空格)。我想数一数前三个空格,我该怎么做?您可以简单地使用fgets()而不是使用scanf()来读取整行,除非您

我有一个我无法克服的简单问题

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  "

a[0]=“a”和B=5(“abc”加上最后两个空格)。我想数一数前三个空格,我该怎么做?

您可以简单地使用
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);
}

如果要修剪前导空格,可以尝试以下操作:

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';
}

解释您的
scanf
代码行的功能。
int空格;scanf(“%n%[^\n]”和空格,a)
使用
%[]
读取一系列空格。只需使用
fgets
读取行,然后计算空格数。您的意思是“计算空格”,就像您希望在结果中包含空格一样吗?还是你真的想数一数?谢谢。这解决了一些问题。我以为fgets忽略了strlen计数中的空格。@Tricolor
strlen()
将计算终止
\0
之前的所有字符。它不会跳过中间的任何字符
fgets()
不同于
scanf()
,因为
scanf()
设计用于解析某些输入,而
fgets()
设计用于从输入流读取整行数据
scanf()
只能用于选定场合的字符串输入。否则,
fgets()
可能就是您所需要的。