C语言 - 从函数返回一个值作为函数参数

时间:2018-05-19 14:23:18

标签: c

我的作业有问题。我需要计算大写字母的数量和字符串中的元音数量。不幸的是,它始终返回数字0,看起来它的功能没有变化。一切都有效,直到这个。

这是我的代码:

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

char *StringChange(char *text, int *upper, int *chars);

int main(void) {
    char text[40];
    int upper, chars;

    puts("Type a string");
    gets(text);

    StringChange(text, &upper, &chars);

    puts("Change words to start with upper case and change white spece to *");
    puts(text);
    printf("Quantity of upper case in string: %d\n", upper);
    printf("Quantity of vowels: %d", chars);

    getch();
    return 0;
}

char *StringChange(char *text, int *upper, int *chars) {
    int i, length;

    length = strlen(text);

    for (i = 1; i <= length; i++) {
        if (text[i - 1] == '*' && (text[i] >= 'a' && text[i] <= 'z')) {
            text[i] = text[i] - 32;
        }
        if (text[i] == ' ') {
            text[i] = '*';
        }
        if (text[i] >= 'A' && text[i] <= 'Z') {
            *upper = *upper + 1;
            /* *upper++; that also doesn't work */
        }
        if (text[i] == 'a' || text[i] == 'e' || text[i] == 'i' || text[i] == 'o' || text[i] == 'u' || text[i] == 'y') {
            *chars = *chars + 1;
            /* *chars++; that also doesn't work */
        }
    }

    if (text[0] >= 'a' && text[0] <= 'z') {
        text[0] = text[0] - 32;
    }

    return (text);
}

2 个答案:

答案 0 :(得分:2)

我尝试了你的代码并且我得到了非零结果 - 当然,这取决于输入,所以也许你只测试产生零的字符串。

但是,结果并不总是正确的。我在代码中发现了两个问题:

1)正如评论中所指出的,您应该将upperchars初始化为0。

2)你正在索引1处开始循环,而不是索引0.我认为你这样做是为了你可以在循环中查看text[i-1],但它会导致你从总数中排除第一个字符。你应该启动循环索引和0并找出一种不同的方法来在循环中处理它。 (提示 - 请注意循环中的第一个if和循环后面的一个具有相似的条件和相同的主体。)

答案 1 :(得分:1)

您的代码中存在多个问题:

  • 你永远不应该使用gets()
  • 变量upperchars未初始化
  • 函数StringChange构成text[0]的特例,但不更新此初始字节的计数。
  • 你硬编码ASCII的小写转换为大写。
  • 你应该停在字符串的末尾
  • 不替换所有空格,在空格后跟小写字母。
  • 也应计算大写元音。

以下是修改后的版本:

#include <stdio.h>

char *StringChange(char *text, int *upper, int *chars);

int main(void) {
    char text[200];
    int upper, vowels;

    puts("Type a string");
    if (fgets(text, sizeof text, stdin)) {
        StringChange(text, &upper, &chars);

        puts("Change words to start with upper case and change white space to *");
        puts(text);
        printf("Quantity of upper case in string: %d\n", upper);
        printf("Quantity of vowels: %d\n", vowels);
    }
    getchar();
    return 0;
}

char *StringChange(char *text, int *upper, int *vowels) {
    int i, at_start = 1;

    *upper = *vowels = 0;
    for (i = 0; text[i] != '\0'; i++) {
        char c = text[i];
        if (at_start && c >= 'a' && c <= 'z') {
            c += 'A' - 'a';
            text[i] = c;
        }
        if (c == ' ') {
            c = '*';
            text[i] = c;
            at_start = 1;
        } else {
            at_start = 0;
        }
        if (c >= 'A' && c <= 'Z') {
            (*upper)++;   // *upper++ would just increment the pointer, leading to undefined behavior
        }
        if (strchr("aeiouyAEIOUY", c) {
            (*vowels)++;
        }
    }
    return text;
}