scanf 只从句子中读取一个单词

Scanf reads only one word from sentence

我是 C 的新手,有点小问题。我需要编写一个程序,让用户输入文本,然后程序显示文本的长度。

我尝试使用 strlen(),但这不是我想要的。

char a[20];
scanf("%s",a)

如果我输入“Hello world”,结果是 5,但我需要 11。

我需要使用 scanf,但也许无法使用它...

%s 是字符串的正确说明符:

char a[20];
scanf("%s", a);
printf("%d", strlen(a));

但是 %s 在空格处停止。如果你也想阅读空格,你应该这样做:

scanf("%[^\n]", a);

scanf() 仅用于一个单词。当它看到一个白色的 space 字符(space,新行)和结尾时,它需要一个词。您应该再次使用 scanf() 来获取另一个词。您可以使用 fgets() 获取一条线。但不要忘记阅读如何使用 fgets() 函数。

另外,用scanf存储必须使用地址

int a;
scanf("%d",&a);

但是对于 char 数组不需要它,因为 char 数组的名称是地址。

char[10]a;
scanf("%s",a);

将 %d 更改为 %s 因为 d代表整数,s代表字符串。

另一个问题是 scanf 将扫描输入直到第一个空格。

在此处阅读更多相关信息 https://www.tutorialspoint.com/format-specifiers-in-c

这次通话

scanf("%s",a)

填充字符数组 a 直到遇到白色 space。所以这个调用将只读取单词“Hello”,输入缓冲区仍将保留第二个单词“world”。

您可以使用其中之一

char a[20];
scanf("%19[^\n]",a );
size_t n = strlen( s );
printf( "%zu\n", n );

这是一个演示程序

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char a[20] = "";
    
    scanf( "%19[^\n]", a );
    
    size_t n = strlen( a );
    
    printf( "%zu: %s\n", n, a );
    
    return 0;
}

如果进入

Hello world

则输出为

11: Hello world

char a[20];

fgets( a, sizeof( a ), stdin );
a[strcspn( a, "\n" )] = '[=15=]';

size_t n = strlen( s );
printf( "%zu\n", n );

这是一个演示程序。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char a[20] = "";
    
    fgets( a, sizeof( a ), stdin );
    a[strcspn( a, "\n" )] = '[=16=]';
    
    size_t n = strlen( a );
    
    printf( "%zu: %s\n", n, a );
    
    return 0;
}

再次进入

Hello world                               

然后输出将与上面显示的相同

11: Hello world