繁体   English   中英

C,计算空白空间的数量

[英]C, counting the number of blankspaces

我正在编写一个将空格替换为' - '(< - this character)的函数。 我最终想要回复我做了多少改变。

#include <stdio.h>
int replace(char c[])
{
    int i, cnt;
    cnt = 0;
    for (i = 0; c[i] != EOF; i++)
        if (c[i]==' ' || c[i] == '\t' || c[i] == '\n')
        {
            c[i] = '-';
            ++cnt;
        }
    return cnt;
}

main()
{
    char cat[] = "The cat sat";
    int n = replace(cat);
    printf("%d\n", n);
}

问题是,它正确地将字符串更改为“The-cat-sat”但是对于n,它返回值3,当它应该返回2.我做错了什么?

@ 4386427建议这应该是另一个答案。 @wildplasser已经提供了解决方案,这个答案解释了EOF和'\\0'

只有在从文件中读取时才会使用EOF (EOF - >文件结束)。 这个讨论。 EOF用于表示文件结尾,其值取决于系统。 事实上,EOF是一种条件,而不是一种价值。 你可以在这个帖子中找到很好的解释。 当使用char数组或char指针时,它将始终以'\\0'字符终止,并且始终只有其中一个,因此,当迭代数组时,您将使用它来突破循环指针。 这是确保您不访问未分配的内存的可靠方法。

  • 一个字符串以0 (零)值结束,而不是EOF (所以:问题中的程序将扫描超出终端\\0的字符串,直到它碰巧在某个地方找到-1 ;但是你已经在UB的土地上,这里)
  • [sylistic]函数参数可以是一个字符指针(C中不能存在数组参数)
  • [stylistic]指针版本不需要'i'变量。
  • [stylistic]计数永远不会是负数:直观地说,无符号计数器是首选。 (它甚至可以是size_t ,就像其他字符串函数一样)
  • [styleistic]一个switch(){}可以避免(IMO)丑陋的|| 列表,添加案例也更容易。

unsigned replace(char *cp){
    unsigned cnt;
    for(cnt = 0; *cp ; cp++) {
        switch (*cp){
        case ' ' : case '\t': case '\n':
                *cp = '-';
                cnt++; 
        default:
                break;
                }
        }
return cnt;
}

for循环结束条件中使用的EOF是问题,因为您不使用的是检查文件/流的结尾。

for (i = 0; c[i] != EOF; i++)

EOF本身不是一个字符,而是一个信号,表示流中没有可用的字符。

如果您要检查行结束,请使用

for (i = 0; c[i] != "\0"; i++)
#include <stdio.h>

int repl(int c);

int main(void){
    int c, nc;
    nc =0;

    while ((c=getchar())!=EOF)
        nc = replc(c);

    printf("replaced: %d times\n", nc);

    return 0;
}

int replc(int c){
    int nc = 0;
    for(; (c = getchar())!=EOF; ++c)
       if (c == ' '){
          putchar('-');
          ++nc;
       } else putchar(c);
    return nc;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM