【问题标题】:How to fix problem counting letters,symbols,numbers in string using function to check number如何使用函数检查数字来解决字符串中的字母、符号、数字计数问题
【发布时间】:2019-06-12 10:58:32
【问题描述】:

我想用函数密码计算字母、数字、符号似乎它没有正确计算数字,因为最后每个 printf 都得到 0

#include <stdio.h>
void password(char * str[],int together,int numbers,int symbols,int i,int uppercase,int lowercase);
int main()
{
    char str[100];
    int together, numbers, symbols, i,uppercase,lowercase;

        together = numbers = symbols = i = uppercase = lowercase = 0;

    printf("password : ");
    gets(&str);
    printf(" %s", str);
    password(&str,together,numbers,symbols,i,uppercase,lowercase);
    printf("Number of letters = %d\n", together);
    printf("number uppercase  = %d\n", uppercase);
    printf("Number lowecase  = %d\n", lowercase);
    printf("numbers = %d\n", numbers);
    printf("Simboli = %d", symbols);
if (together >= 8 && numbers >= 2){
    printf("\nPassword is correct");
}else{
    printf("\nPassword isn't correct");
}
    return 0;
}
void password(char * str[],int together,int numbers,int symbols,int i,int uppercase,int lowercase){
     while(*str[i]!='\0')
    {
        if((*str[i]>='a' && *str[i]<='z') || (*str[i]>='A' && *str[i]<='Z'))
        {
            together++;
        }
        else if(*str[i]>='0' && *str[i]<='9')
        {
            numbers++;
        }
        else if(*str[i] >= 'A' && *str[i] <= 'Z') {
         uppercase++;
        }
        else if(*str[i] >= 'a' && *str[i] <= 'z'){
            lowercase++;
        }
        else
        {
            symbols++;
        }

        i++;
    }
}

每个数字、字母和符号程序运行时都没有任何错误,我尝试更改一些内容,但我目前正在学习 C,所以这对我来说很难!

【问题讨论】:

  • 参数按值传递。这意味着如果您在函数中更改它们,它们只会在本地更改。您需要将指针传递给它们,然后通过它更改值。
  • 你能在我的代码中给我一个例子吗
  • 我尝试将 str[] 更改为 *str[] 然后在 gets(&str) 中编辑它,但仍然得到零
  • 这不是你要返回一个值的变量

标签: c


【解决方案1】:

几点:1) 无需传递 i 作为参数,因为您可以使用 strlenstring.h 获取字符串的长度(返回 size_t 类型而不是 int)。 2)您将参数作为值传递,这意味着它们只会在本地更改为您的函数。 3) 不要使用不安全的gets函数,你可以使用fgets或者scanf

#include <string.h>
#include <stdio.h>

void password(char *str, int *together, int *numbers, int *symbols, int *uppercase, int *lowercase){
    for(size_t i=0; i<strlen(str); i++){
        if(str[i] >= '0' && str[i] <= '9') (*numbers)++;
        if(str[i] >= 'A' && str[i] <= 'Z') (*uppercase)++;
        if(str[i] >= 'a' && str[i] <= 'z') (*lowercase)++;
        if(str[i] >= '!' && str[i] <= '/') (*symbols)++;
    }
    *together = (*uppercase) + (*lowercase);
}

int main(void){

    char str[100] = "Pa$$w0/2d";
    int together = 0;
    int numbers = 0;
    int symbols = 0;
    int uppercase = 0;
    int lowercase = 0;

    password(str, &together, &numbers, &symbols, &uppercase, &lowercase);
    printf("Letters = %d\n", together);
    printf("Uppercase  = %d\n", uppercase);
    printf("Lowercase = %d\n", lowercase);
    printf("Numbers = %d\n", numbers);
    printf("Symbols = %d\n", symbols)

    return 0;
}

【讨论】:

  • 感谢您的帮助!这帮助我理解了我可以使用 strlen() 来尝试从其他人和在线教程中学习的东西。我删除了 ="Pa$$w0/2d' 并将其替换为 scanf(" %s",&str)。
  • @MarinSpudić 希望您现在理解得更好。此外,如果您首先通过char str[100] 初始化您的str,您将通过执行scanf("%s", &amp;str) 得到警告:当您给它一个char ** 时,%s 期望一个char *。所以你必须删除&amp;。 (使用 gcc 编译时,您可以通过提供标志 -Wall -Wextra 来查看警告)
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2011-07-09
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多