计算整个字符串,包括C中的空格

计算整个字符串,包括C中的空格,c,C,我试图设置一个代码,对整个字符串进行计数,并且在找到第一个空格后不会停止。我该怎么做 我尝试过这种代码,但它只计算第一个单词,然后显示第一个单词中的字母数 到目前为止,这就是我所尝试的 int main(){ char get[100]; int i, space=0, len=0, tot; scanf("%s", get); for (i=0; get[i]!='\0'; i++) { if (get[i] == ' ')

我试图设置一个代码,对整个字符串进行计数,并且在找到第一个空格后不会停止。我该怎么做

我尝试过这种代码,但它只计算第一个单词,然后显示第一个单词中的字母数

到目前为止,这就是我所尝试的

int main(){
    char get[100];
    int i, space=0, len=0, tot;
    scanf("%s", get);

    for (i=0; get[i]!='\0'; i++)
    {
        if (get[i] == ' ')
            space++;
        else 
            len++;
    }

tot = space + len;
printf("%i", tot);
}

但仍然会得到与第一个相同的答案

我以为如果 输入:狐狸很漂亮。 产出:19

但我得到的只是 输入:狐狸很漂亮。
输出:3

strlen
已经包含空格,因为它计算字符串的长度直到终止的NUL字符(零,
'\0'

您的问题是,
scanf
%s
转换遇到空白时会停止读取,因此您的字符串从一开始就没有包含它(您可以通过打印字符串轻松验证这一点)。(您可以通过使用不同的
scanf
转换来修复此问题,但一般来说,通过使用
fgets
读取数据更容易纠正问题–它还强制您指定缓冲区大小,修复当前代码中潜在的缓冲区溢出。)

诊断正确。 但是,如果您希望使用scanf,可以执行以下操作:

scanf("%99[^\n]", get);
if(scanf("%99[^\n]", get) == 0){
    get[0] = 0; //Put in a NUL terminator if scanf read nothing
}

getchar();      //Remove the newline character from the input buffer
99
告诉scanf不要读取超过99个字符,这样您的
get
缓冲区就不会溢出。
[^\n]
告诉scanf读取任何字符,直到它遇到换行符为止(当您按enter键时)

正如Chux指出的,该代码仍然有两个问题

使用scanf时,最好检查其返回值,即可以读取的项目数。此外,使用上述语法时,
\n
确实保留在输入缓冲区中。所以,你可以这样做:

scanf("%99[^\n]", get);
if(scanf("%99[^\n]", get) == 0){
    get[0] = 0; //Put in a NUL terminator if scanf read nothing
}

getchar();      //Remove the newline character from the input buffer

这可能很有用:当输入为
'\n'
时,此代码不会将任何内容读入
get
,而
'\n'
仍保留在
stdin
get[]
保持未分配状态,然后执行以下
get[i]!='\0'
是UB。始终保持警惕…谢谢。更好,UV,但是
getchar()
可能由于输入太长而读取非换行符。迂腐的代码可以使用
scanf(“%*1[^\n]”)返回可能的尾随换行符。依我看,正是这些情况使得
fgets()
更容易使用,但是
fgetc()
也有它的问题。@chux有趣,我不知道这种语法。是的,scanf通常比它的价值更麻烦,而且我很少在我的代码中使用它。但是很多问题都涉及到它,通常是由学生提出的,因为这是作业中的一项要求。如果只使用
scanf
阅读,而不需要捕获前导空格,一种选择是只在格式字符串前加一个空格,以使用任何现有空格(例如,
%99[^\n]“
)。但是,如果输入格式比这里复杂,IMO所有
scanf
解决方案都会变得棘手(例如,需要为不同类型和数量的字段使用错误的非空白),因此,我甚至不希望在我的答案中包含
scanf
选项……即使
fgets
后跟
sscanf
也更容易正确。