我的作业有问题。我需要计算大写字母的数量和字符串中的元音数量。不幸的是,它始终返回数字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);
}
答案 0 :(得分:2)
我尝试了你的代码并且我得到了非零结果 - 当然,这取决于输入,所以也许你只测试产生零的字符串。
但是,结果并不总是正确的。我在代码中发现了两个问题:
1)正如评论中所指出的,您应该将upper
和chars
初始化为0。
2)你正在索引1处开始循环,而不是索引0.我认为你这样做是为了你可以在循环中查看text[i-1]
,但它会导致你从总数中排除第一个字符。你应该启动循环索引和0并找出一种不同的方法来在循环中处理它。 (提示 - 请注意循环中的第一个if
和循环后面的一个具有相似的条件和相同的主体。)
答案 1 :(得分:1)
您的代码中存在多个问题:
gets()
。upper
和chars
未初始化StringChange
构成text[0]
的特例,但不更新此初始字节的计数。以下是修改后的版本:
#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;
}