整数从指针警告

问题描述:

我有我的问题。我从控制台收到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; 
} 
+2

看看'isalpha'和'isdigit'应该如何被调用。 –

好吧,我有这样的事情:

#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)符合标准。

isalphaisdigit都应该测试,如果取为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)) ... 
    ... 
}