我有问题。我从控制台收到2个警告,但我不知道我的代码有什么问题。你看看吗? 程序假设显示至少包含11个字符和4个数字的行
<html>
<head>
<title>Side Scroll Test</title>
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1, user-scalable=no">
</head>
<body>
<div id="scroll_cont">
<div class="scroll_item">Test1</div>
<div class="scroll_item">Test2</div>
<div class="scroll_item">Test3</div>
<div class="scroll_item">Test4</div>
<div class="scroll_item">Test5</div>
</div>
</body>
</html>
答案 0 :(得分:1)
isalpha()
和isdigit()
函数需要int
。但是你传递的是char*
,即数组line
被转换为指向其第一个元素的指针(参见:What is array decaying?)。这就是编译器抱怨的内容。您需要遍历line
以查找其中的位数和字母数。
另请注意,如果line
有空格,fgets()
会在换行符中读取。因此,您需要在计数之前将其修剪掉。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
char line[200];
printf("Enter a string: \n");
while(fgets(line, sizeof(line),stdin))
{
int numberAlpha = 0;
int numberDigit = 0;
line[strcspn(line, "\n")] = 0; // Remove the trailing newline, if any.
for (size_t i = 0; line[i]; i++) {
if(isalpha((unsigned char)line[i])) numberAlpha++;
else if((unsigned char)isdigit(line[i])) numberDigit++;
}
printf("alpha: %d, digits:%d \n", numberAlpha, numberDigit);
}
return 0;
}
答案 1 :(得分:1)
isalpha()
和isdigit()
都需要int
,而不是char *, as argument
。
在您的代码中,通过将数组名称作为参数传递,您实际上是在传递char *
(array name decays to the pointer to the first element when used as function argument),因此,您将收到警告。
您需要遍历line
的各个元素并将它们传递给函数。
那就是说,对于托管环境,int main()
只应该int main(void)
符合标准。
答案 2 :(得分:1)
isalpha
和isdigit
应该测试char
被视为int
(char
是否可以安全地转换为int
)是字母数字或数字字符的编码。您传递了char
数组,而不是个人char
。你需要测试你得到的每个char
字符串,所以你需要一个循环:
for (int i=0; i<strlen(line); i++) {
if (isalpha(line[i])) numberAlpha++;
...
}
最好一次计算长度:
int length = strlen(line);
for (int i=0; i<length; i++) {
...
}
您也可以使用指针沿着字符串移动:
for (char *ptr = line; *ptr!=`\0`; ptr++) {
if (isalpha(*ptr)) ...
...
}
答案 3 :(得分:1)
好的,我有这样的事情:
#include <stdio.h>
#include <ctype.h>
int main()
{
char line[200];
printf("Enter a string: \n");
while(fgets(line, sizeof(line),stdin))
{
int numberAlpha = 0;
int numberDigit = 0;
int i;
for(i=0; i<strlen(line); i++){
if(isalpha(line[i])) numberAlpha++;
else if(isdigit(line[i])) numberDigit++;
}
if(numberAlpha+numberDigit>10 && numberDigit>3) printf("%s \n", line);
}
return 0;
}
现在的问题是,如果可以使它首先接受数据,然后只显示if语句后面的那些行。现在它在输入之后显示行。