保持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计数中的空格。@Tricolorstrlen()
将计算终止\0
之前的所有字符。它不会跳过中间的任何字符fgets()
不同于scanf()
,因为scanf()
设计用于解析某些输入,而fgets()
设计用于从输入流读取整行数据scanf()
只能用于选定场合的字符串输入。否则,fgets()
可能就是您所需要的。