为什么代码中strlen(count)-1中的-1没用?

为什么代码中strlen(count)-1中的-1没用?不论strlen(count)减几输出的值都是strlen(count)

img

应该第14行没有执行过 一直是第11行在打印。上面的strrchr 使用判断死循环了

说两个问题

  1. 数组赋值,char count[100] = {'\0'}将数组初始化为空,一般是这么写;
  2. scanf_s函数的应用问题,你要通过调试的手段,查看每次执行后末尾是否自动添加上'\0',操作手法,就是第一次输入一个比较长的字符串,第二次输入一个较短的字符串,看看两次输出或者调试一下看看

strlen函数返回的是size_t类型的值,size_t是无符号整数,这里要注意如果用返回值进行减法运算的话可能会出错
http://t.csdn.cn/vBYZ3

while循环进入死循环了吧,导致你后面打印的strlen(count)-1一直没有执行。建议检查下循环的问题

你好,我在你的代码中进行备注了,你看看能不能理解

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

int main()
{
    /*
    这里有逻辑错误。这样写会把count数组的第一个元素初始化为字符'0',而不是数字0。这会导致strlen(count)的结果为1,而不是0。如果你想把count数组初始化为空字符串,你可以写成
    char count[100] = "";
    或者
    char count[100] = {'\0'};
    */
    char count[100] = "0"; 
    printf("请输入单词:\n");
    scanf_s("%s",count,100);

    /*
    这里有两个问题。第一个问题是,你应该使用strrchr(count,',')而不是strrchr(count,1)来检查输入的单词是否以逗号结尾。strrchr函数的第二个参数应该是一个字符,而不是一个数字。如果你写成strrchr(count,1),它会把1当成ASCII码为1的控制字符,而不是数字1。第二个问题是,你应该使用== NULL而不是!= ','来判断strrchr函数的返回值。strrchr函数会返回一个指针,指向字符串中最后一个出现的指定字符的位置。如果没有找到这个字符,它会返回NULL。
    */
//    while(strrchr(count,1) != ',')
    while(strrchr(count,',') == NULL)
    {
        printf("%d",strlen(count));
        scanf_s("%s",count,100);
    }
    printf("%d",strlen(count)-1);
}
  • 这篇博客: strlen函数的三种写法中的 第一种,也是最简单的,使用count计数器法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • int my_strlen2(char *arr)//count计数器法
    {
        int count = 0;
        while (*(arr++))
        {
            count++;
        }
        return count;
    }
  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题中指出在使用strlen函数的时候,将获得的字符串长度减1的操作没有起到作用,无论将减去的数字增加还是减小,输出的结果都和strlen的结果一样。这个问题出现的原因可能是在字符串的结尾处没有正确添加结束符\0。

    假设给出的字符串为str,使用strlen函数的代码为:

    int len = strlen(str); //获取字符串长度
    int newlen = strlen(str) - 1; //获取字符串长度减1
    

    如果字符串str的结尾没有添加\0,那么strlen函数会一直扫描内存直到遇到0x00为止。此时如果字符串的结尾没有被正确赋值成0x00,那么strlen函数会继续扫描下去,直到扫描到内存结束。这个时候strlen函数返回的长度会比实际字符串的长度多1。因此减去1之后输出的结果和strlen函数的结果一样。

    解决这个问题的方法就是在字符串的结尾处添加一个结束符\0。可以使用strncpy函数来完成这个操作,代码如下:

    #include <string.h>
    #include <stdlib.h>
    
    int main() {
        char str[] = "hello world";
        int len = strlen(str);
        char* newstr = (char*)malloc(len + 1); //为新字符串分配内存
        strncpy(newstr, str, len); //复制字符串到新内存
        newstr[len] = '\0'; //在字符串结尾处添加\0
        int newlen = strlen(newstr) - 1; //获取新字符串长度减1
        free(newstr); //释放动态分配的内存
        return 0;
    }
    

    这个代码使用了动态分配内存的方式来复制字符串,并在字符串结尾处添加结束符。最后释放动态分配的内存,可以保证内存不被浪费。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
C/C++中的字符串以'\0' (空字符)结束,strlen函数的作用是计算这个字符串的实际长度,但不包括空字符。所以,strlen返回的值等于字符串的长度减去1.

在这种情况下,实际上strlen(count)-1是有用的,它返回字符串count的长度,除去最后一个字符的索引值。例如,如果count是一个8个字符的字符串,那么strlen(count)将返回8,strlen(count)-1将返回7。

给定下面这个示例代码:

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

int main() {
    char count[] = "hello world";
    printf("%d\n", strlen(count)-1); // 输出7
    return 0;
}

在这个示例代码中,strlen(count)将计算字符串"hello world"的长度并返回11,但strlen(count)-1将返回10(不包括最后一个字符),结果会打印出数字7。但是,如果将代码中的-1去掉,得到的结果还是11,这是因为strlen函数返回的是字符串的实际长度,不包括空字符,而不是索引。

所以,-1的主要作用是返回字符串的实际长度,而不是字符串的最后一个字符的索引。
如果我的回答解决了您的问题,请采纳!

while语句死循环了

引用chatGPT作答,在C语言中,strlen()函数返回一个字符串的长度,但不包括字符串末尾的空字符('\0')。因此,如果你有一个字符串count,并调用strlen(count),它将返回字符串中字符的数量,但不包括字符串末尾的空字符。所以如果你的字符串是"hello",那么strlen(count)将返回5。

现在考虑这个表达式:strlen(count)-1。这个表达式的意思是取字符串的长度并减去1。然而,由于strlen()函数不包括字符串末尾的空字符,减去1实际上是从字符串的最后一个实际字符的位置减去1,而不是减去空字符。因此,这个表达式实际上是取得字符串中的最后一个字符的位置。如果你想访问字符串中的最后一个字符,可以这样做:count[strlen(count)-1]。

无论strlen(count)的返回值是多少,这个表达式都会计算字符串中最后一个字符的位置。因此,减去1似乎是没有必要的。