在C语言中计算整个字符串的长度(包括空格)

3
我正在尝试设置一个可以计算整个字符串的代码,并且不在找到第一个空格后停止。我该如何做?
我尝试了这样的代码,但它只会计算第一个单词,然后显示该第一个单词中字母的数量。
到目前为止,这是我所尝试的。
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);
}

并且

int main(){
    char get[100];
    int len;
    scanf("%s", &get);
    len = strlen(get);
    printf("%i", len);
}

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

我期望的是如果输入:狐狸很美丽。 输出结果应该是:19

但是我得到的是 输入:狐狸很美丽。 输出结果是:3


1
这可能会有用:https://dev59.com/ZnM_5IYBdhLWcg3wvV5w - Jabberwocky
3个回答

5

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

你的问题在于scanf%s转换会在遇到空格时停止读取,所以你的字符串一开始就没有包含空格(你可以通过打印字符串轻松验证这一点)。(你可以通过使用不同的scanf转换来解决这个问题,但通常通过使用fgets来读取更容易正确操作——它还强制你指定缓冲区大小,修复了当前代码中潜在的缓冲区溢出问题。)


2
Arkku提供的答案在诊断方面是正确的。但是,如果你想使用scanf,你可以这样做:
scanf("%99[^\n]", get);
99告诉scanf不要读取超过99个字符,这样您的get缓冲区就不会溢出。 [^\n]告诉scanf读取任何字符,直到遇到换行符(当您按下回车键时)。
正如Chux指出的那样,此代码仍有两个问题。
使用scanf时,始终检查其返回值,即它可以读取的项目数是一个好习惯。此外,确实在使用上述语法时输入缓冲区中仍然存在\n。因此,您可以这样做:
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

3
当输入为 '\n' 时,这段代码不会读取任何内容到 get 中,而 '\n' 会留在标准输入中。此时,get[] 保持未分配状态,接下来的 get[i]!='\0' 是未定义行为。 - chux - Reinstate Monica
时刻警惕着...谢谢。 - GermanNerd
1
更好的选择是使用 fgets() 函数,它可以避免 getchar() 由于输入过长而读取非换行符的情况。严谨的代码可以使用 scanf("%*1[^\n]"); 来返回 可能存在的 尾随换行符。在我看来,正是这些边缘情况使得 fgets() 更易于使用,但 fgetc() 也有其问题。 - chux - Reinstate Monica
1
如果只使用scanf读取,且没有必要捕获首部空格,则可以在格式字符串前面添加一个空格以消耗任何现有的空格(例如: " %99[^\n]")。然而,如果输入格式比这里更复杂,我认为所有的scanf解决方案都会变得棘手(例如,需要消耗不同类型和数目的非空格错误),因此我甚至不愿在我的答案中包括一个scanf选项。即使使用fgets跟随sscanf也要容易得多。 - Arkku
@Arkku 对 scanf() 的缺点表示同意。请注意,在使用 " %99[^\n]" 时,即使输入 "\n"scanf() 也不会返回,因为它在等待更多的输入。 - chux - Reinstate Monica
显示剩余2条评论

1
我会举一个例子来解释这个概念。
main()
{
  char s[20], i;

  scanf("%[^\n]", &s);
    while(s[i] != '\0') {
       i++;
   }
  printf("%d", i);

  return 0;
}

我已经使用了C语言,你可以循环遍历字符串的结尾部分来获取长度。在这里,我使用了“编辑设置转换方法”来读取字符串,你也可以使用它来读取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接