整数从指针警告
我有我的问题。我从控制台收到2条警告,但我不知道我的代码有什么问题。你可以看看吗? 方案假设,以显示线与至少11个字符和4个数字整数从指针警告
#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;
if(isalpha(line)) numberAlpha++;
else if(isdigit(line)) numberDigit++;
if(numberAlpha+numberDigit>10 && numberDigit>3) printf("%s \n", line);
}
return 0;
}
好吧,我有这样的事情:
#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语句的行。现在它显示了输入之后的行。
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;
}
两个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)
符合标准。
isalpha
和isdigit
都应该测试,如果取为int
一个char
(一个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)) ...
...
}
看看'isalpha'和'isdigit'应该如何被调用。 –