gpt4 book ai didi

c - 使用 while(str[n++]! ='\0' ) 计算字符串的长度

转载 作者:行者123 更新时间:2023-12-03 18:39:31 25 4
gpt4 key购买 nike

请忽略那里的日本人。
我尝试使用以下代码计算从 stdin 输入的字符串的长度。但它没有按预期工作:

#include <stdio.h>

int main(int argc, const char *argv[]) {
char str[100];

printf("文字列を入力してください:"); // Please enter a string:
fgets(str,99,stdin);

int n = 0;
while (str[n++] != '\0');
printf("文字列の長さは%dです\n", n); // The length of the string is %d\n
return 0;
}
例如,如果我输入 glacious ,我会得到 n=10 ,我希望它是 n=8
我知道 n++ 会在 str[n++] != '\0' 得到评估后增加 n,并且 \0 是附加到每个字符串的默认字符。但不知何故,这对我来说没有意义。我知道我可以通过在最后添加 n-=2 来达到我的目的,但我真的很想了解这里发生了什么。提前谢谢了!

最佳答案

“我尝试计算从 stdin 输入的字符串的长度”...“我知道我可以通过在末尾添加 n-=2 来达到我的目的,但我真的很想了解这里发生了什么。”
fgets() 的文档包括以下内容:

"...reads a line from the specified stream and stores it into the string pointed to by str. It stops when either (n-1) characters areread, the newline character is read, or the end-of-file is reached,whichever comes first."


此调用不检查函数的返回值,并通过传递不正确的字符串长度值,限制了检测错误的可能性,并引入了未定义行为的可能性。要解决这些问题,请更改以下内容:
fgets(str,99,stdin); 
例如:
if( fgets (str, sizeof str, stdin) != NULL ) 
{
...
剖析以下内容:给定用户输入值: "glacious"str 在内存中看起来像这样:
|g|l|a|c|i|o|u|s|\n|\0|?|...|?|
0 1 2 3 4 5 6 7 8 9 10 99

int n = 0;
while(str[n++] != '\0');
迭代:
    n at start                       n at finish
  • 1st: n==0 , str[0] ( g ) != \0 , n++ , n==1
  • 2nd: n==1 , str[1] ( l ) != \0 , n++ , n==2
  • 3rd: n==2 , str[2] ( a ) != \0 , n++ , n==3
  • 4th: n==3 , str[3] ( c ) != \0 , n++ , n==4
  • 5th: n==4 , str[4] ( i ) != \0 , n++ , n==5
  • 6th: n==5 , str[5] ( o ) != \0 , n++ , n==6
  • 7th: n==6 , str[6] ( u ) != \0 , n++ , n==7
  • 8th: n==7 , str[7] ( s ) != \0 , n++ , n==8
  • 9th: n==8 , str[8] ( \n ) != \0 , n++ , n==9
  • 10th: n==9 , str[9] ( \0 ) == \0 , n++ , n==10

  • 清楚地说明了所有迭代的状态,包括 n 的最终后增量,将其总数带入 10 以假设用户输入仅为 8 字符。 \n 和最后的后增量(对于 \0) account for the additional value to n`。总而言之,问题只是调整您的期望以考虑缓冲区中的所有字符,包括您看不到的字符。
    有趣的是, n 的计数值并不等同于测量 str 的字符串长度,为此,惯用方法 ( strlen() ) 将产生 9. 给定 definition of a C string ,以下显示了查看 str 的每种相应方法的不同结果,假设初始化:
    char str[100] = {0}; 
    str 的内容是: "glacious\n"//null terminator is implied
    //method to calculate n in discussion above
    // //yields n == 10
    int len = strlen(str); //yields n == 9
    //after using strcspn()
    str[strcspn(str, "\n")] = 0;
    len = strlen(str); //yields n == 8
    size_t size = sizeof str; //yields size == 100
    顺便说一句,如果目标是计算条目的数量,并且可以使用替代方法,请考虑简化该方法......
    替换本节:
    char str[100];

    printf("文字列を入力してください:");
    fgets(str,99,stdin);

    int n = 0;
    while(str[n++] != '\0');
    printf("文字列の長さは%dです\n", n);
    return 0;
    使用这个将在看到 \n(换行符)或 EOF( -1)( #define 中的 stdio.h)时打破循环,从而得到正确的用户输入计数(减去换行符):
    int count = 0;
    printf("Please enter a string:");
    int c = fgetc(stdin);
    while(( c != '\n') && (c != EOF))
    {
    count++; //only increments when c meets criteria
    fputc(c, stdout);
    c = fgetc(stdin);
    }
    printf("\n\nThe length of the string is: %d\n", count);
    return 0;

    关于c - 使用 while(str[n++]! ='\0' ) 计算字符串的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65525738/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com