C中的gets()问题

时间:2011-04-12 08:14:26

标签: c gcc compilation gets

我写了以下代码:

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

#define SIZE 128

int main ()

{
    char mychar , string [SIZE];
    int i;
    int const count =0 ;    

    printf ("Please enter your string: \n\n");
    fgets (string, SIZE, stdin);

    printf ("Please enter char to find: ");
    mychar = getchar();

    for (i=0 ; (string[i] == '\0') ; i++ )
        if ( string[i]  == mychar )
            count++;

    printf ("The char %c appears %d times" ,mychar ,count);

    return 0;
}

问题是gcc给了我'int const count'的错误:“只读变量'count'的增量。”

什么似乎错了?

谢谢!

7 个答案:

答案 0 :(得分:3)

尝试使用fgets代替:

fgets (string, SIZE, stdin);

为什么gets不安全,已在SO上多次回答。您可以看到this

答案 1 :(得分:1)

始终使用 fgets() 而不是gets。还有很多东西要修复。您不应该使用标准库函数来创建用户界面。标准库真的没有设计。相反,您应该使用 curses库或类似的东西。您也可以将程序编写为接受arguments 作为输入。

正确使用标准库的简短示例。此版本没有任何错误检查,因此它假定用户输入正确。

#include <stdio.h>

int main(int artc, char *argv[])
{
    /* arguments are strings so assign only the first characte of the
     * third argument string. Remember that the first argument ( argv[0] ) 
     * is the name of the program. 
     */
    char  mychar = argv[2][0];
    char *string = argv[1];
    int i, count = 0;

    /* count the occurences of the given character */
    for(; *string != '\0'; ++string)
        if(*string == mychar) ++count;

    printf("The char ‘%c’ appears %d times.\n", mychar, count);

    return 0;
}

用法: ./count "Hello, World!" l

输出: The char ‘l’ appears 3 times.


编辑:至于原始代码。将==更改为!=

for (i=0 ; (string[i] == '\0') ; i++ )

为:

for (i=0 ; (string[i] != '\0') ; i++ )

比较错误。

答案 2 :(得分:1)

要使此示例有效,您还应该更改行:

if(*string == mychar) ++count;

进入

if(string[i] == mychar) ++count;

现在有完整的工作示例:

#include <stdio.h>

int main(int artc, char *argv[])
{
/* arguments are strings so assign only the first characte of the
 * third argument string. Remember that the first argument ( argv[0] ) 
 * is the name of the program. 
 */
char  mychar = argv[2][0];
char *string = argv[1];
int i, count = 0;

/* count the occurences of the given character */
for (i=0 ; (string[i] != '\0') ; i++ )
    if(string[i] == mychar) ++count;

printf("The char ‘%c’ appears %d times in the sentence: %s\n", mychar, count, string);

return 0;
}

答案 3 :(得分:0)

请考虑替换为“scanf( "%s", &string)”。

答案 4 :(得分:0)

获取是危险的,因为它允许您读取比分配空间更多的数据,您可以使用fgets指定要读入的字符数,如果找到换行符则停止。

答案 5 :(得分:0)

获取是危险的,因为它可以获取比变量大小更多的数据。从而使系统暴露于攻击并危及安全性。 应该使用fgets,因为它限制了no。要读的字符。

答案 6 :(得分:0)

这样做:

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

#define SIZE 128

int main()
{
  char mychar, string[SIZE];
  int i;
  int count=0;    

  printf("Please enter your string: ");
  fgets(string, SIZE, stdin);

  printf("Please enter char to find: ");
  mychar = getchar();

  for (i = 0; (string[i] != '\0'); i++)
    if (string[i] == mychar) ++count;

  printf("The char %c appears %d times in the sentence: %s" ,mychar ,count, string);

  return 0;
}