2017-10-14 27 views
6

我正在写一个函数将空格替换为' - '(< - 这个字符)。 我最终想要返回我所做的更改。C,计算空格的数量

#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); 
} 

的问题是,它正确地改变串入“的猫饱和”,但对于n,则返回值3,当它应该返回2. 我做了什么错?

+1

'C [1] = EOF' - !>>'C [1] = 0' – wildplasser

+0

添加到@wildplasser说了什么,'c [i] =='\ n'' ..你真的需要吗? –

+0

它为我提供正确的输出 – krpra

回答

1

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

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

0
  • 的字符串与0(零)值,而不是一个EOF(这样结束:在有问题的程序将扫描串超越终端\0,直到它恰好找到一个-1地方超越;但你已经在UB土地,这里)
  • [sylistic]函数参数可能是一个字符指针(数组参数不能存在于C中)
  • [样式]指针版本不需要'i'变量。
  • [文体]计数永远不会为负:直观地说,无符号计数器是首选。 (它甚至可以是size_t,就像其他字符串函数一样)
  • [stylistic] a 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; 
} 
0

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

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

EOF本身不是一个人物,而是一个信号,即有流中没有可用的多个字符。

如果你尝试检查行的末尾请使用

for (i = 0; c[i] != "\0"; i++) 
+1

我认为你的意思是使用空字符''\ 0'',如'for(i = 0; c [i]!='\ 0'; i ++)',而不是'“\ 0”'。 –

0
#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; 
}