我试图编写一个循环来计算字符,直到它收到某个标记值。哨兵值应该是#,但我也尝试了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)
}
答案 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