使用字符作为标记但接收指针错误

时间:2015-05-04 16:38:24

标签: c sentinel

我试图编写一个循环来计算字符,直到它收到某个标记值。哨兵值应该是#,但我也尝试了0和Z并且有相同的响应。

当它编译时,我收到"警告:指针和整数之间的比较"对于第16行(调用哨兵的行。)

如果我没有定义哨兵,而是依赖于while语句中的逻辑运算符,那么我不会收到任何错误,但会有无限循环。

谢谢!

#include <stdio.h>
int main()
{

#define SENTINEL '#'
char ch;
int chcount;

printf("Enter your text, terminate with a #:");
scanf("%s", &ch);
chcount = 0;

while (ch != SENTINEL)
{
    if ((ch >= 'A') && (ch <= 'Z'))
    {
        chcount = chcount +1;
        printf("You have entered %d characters", chcount);
    }
}
return(0)
}

5 个答案:

答案 0 :(得分:1)

使用%s格式说明符,scanf需要char缓冲区的地址,其中您键入的字符串将被复制。

你给了一个char的地址&ch,这显然不足以在输入中包含一个带有终止空字符的“单词”。

此外,您的循环不会读取用户的任何输入。因此无限循环。

答案 1 :(得分:0)

我在您的代码中发现的一些问题:

scanf("%s", &ch);

应该是

scanf("%c", &ch);

接下来,此处缺少分号:return(0);

但是,因为你的目标是:

  

我正在尝试编写一个对字符进行计数的循环,直到它收到某个标记值。 sentinel值应该是#

我建议将scanf()移到while循环中:

#include <stdio.h>
int main()
{

#define SENTINEL '#'
char ch='0';
int chcount;

printf("Enter your text, terminate with a #:");

chcount = 0;
int i=0;
while (ch != SENTINEL)
{ scanf("%c", &ch);
if ((ch >= 'A') && (ch <= 'Z'))
{

    chcount = chcount +1;
    printf("You have entered %d characters", chcount);
    i++;
}
}
return(0);
}

答案 2 :(得分:0)

这是因为您使用scanf()的方式,%s格式说明符正在写入char*,而不是char ch(正如您声明的那样)。要写入单个char变量,您应该使用%c格式说明符。

要解决此问题,您应该使用f.e. getchar()代替scanf()或使用scanf()(然后将ch更改为char*),但迭代扫描的字符串以检查是否#

我会推荐第一个解决方案。

答案 3 :(得分:0)

while循环永远不会结束,所以我改变了你的while循环。

我尝试将您的计划更改为:

#include <stdio.h>

#define SENTINEL '#'

int main()
{
    char ch;
    int chcount;

    printf("Enter your text, terminate with a #:");
    chcount = 0;

    while ((ch = getchar()) != SENTINEL)
    {
        if ((ch >= 'A') && (ch <= 'Z'))
        {
            chcount = chcount + 1;
            printf("You have entered %d characters\n", chcount);
        }
    }
    return(0);
}

答案 4 :(得分:0)

这是已发布代码的工作版本。

它包含许多更正。

更正包括一致/可用的缩进和逻辑更正

注意:并非所有实现都具有getline()函数

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    int sentinelFound = 0;
    #define SENTINEL '#'
    char* line = NULL;
    size_t lineLen = 0;

    printf("Enter your text, terminate with a #:");
    int chcount;
    getline(&line, &lineLen, stdin );

    size_t i;
    for( i=0; i<lineLen; i++)
    {
        if( SENTINEL == line[i] )
        {
            sentinelFound = 1;
            break;
        }

        if ((line[i] >= 'A') && (line[i] <= 'Z')) // only count capital letters
        {
            chcount = chcount +1;
        }
    }

    free( line );

    if( !sentinelFound )
        printf( "You did not enter the sentinel character!" );
    else
        printf("You have entered %d capital characters\n", chcount);

    return(0);
} // end function:  main