这是我的程序(学校练习,应该是从用户那里接收一个字符串,更改它并以某种格式返回原始字符串和新字符串):
#include <stdio.h>
#define MAX_STRING_LENGTH 50
char switchChar(char c) {
if ((c >= 'A') && (c <= 'Z')) {
c = c + 32;
} else
if ((c >= 'a') && (c <= 'z')) {
c = c - 32;
}
if ((c > '5') && (c <= '9')) {
c = 56;
}
if ((c >= '0') && (c < '5')) {
c = 48;
}
return c;
}
int main(void) {
char temp;
int i = 0;
char stringInput[MAX_STRING_LENGTH + 1];
printf("Please enter a valid string\n");
fgets(stringInput, 50, stdin);
char newString[MAX_STRING_LENGTH + 1];
while ((i != MAX_STRING_LENGTH + 1) && (stringInput[i] != '\0')) {
temp = switchChar(stringInput[j]);
newString[i] = temp;
i++;
}
printf( "\"%s\"", stringInput);
printf("->");
printf( "\"%s\"", newString);
return 0;
}
运行时,输出在字符串之后和最后一个 "
字符之前向下一行,尽管它应该全部打印在同一行中。
如有任何指示,我将不胜感激。
您的代码中存在几个问题:
fgets()
如果存在并且有足够的空间可用,则读取并在目标数组的末尾保留换行符。为了与您的算法保持一致,您应该删除此换行符。您可以使用 stringInput[strcspn(stringInput, "\n")] = '\0';
安全地执行此操作如果您不能使用 <string.h>
,请使用更多代码.这个换行符的存在解释了观察到的不良行为。
你读了一行 fgets()
, 但您传递的缓冲区大小可能不正确:硬编码为 50
当数组大小为 MAX_STRING_LENGTH + 1
.与 MAX_STRING_LENGTH
定义为 50
, 这不是问题,但如果您稍后更改宏的定义,您可能会忘记将大小参数更新为 fgets()
.使用 sizeof stringInput
为了一致性
您忘记在 newString
中设置空终止符.测试 i
的边界值没有必要,因为 stringInput
在数组边界内以 null 终止。
在 switchChar()
,您不应该对 ASCII 字符集中的字符值进行硬编码:它会降低可移植性,最重要的是,会降低可读性。
这是一个更正和简化的版本:
#include <stdio.h>
#define MAX_STRING_LENGTH 50
char switchChar(char c) {
if ((c >= 'A') && (c <= 'Z')) {
c = c + ('a' - 'A');
} else
if ((c >= 'a') && (c <= 'z')) {
c = c - ('a' - 'A');
} else
if ((c > '5') && (c <= '9')) {
c = '8';
} else
if ((c >= '0') && (c < '5')) {
c = '0';
}
return c;
}
int main(void) {
char stringInput[MAX_STRING_LENGTH + 1];
char newString[MAX_STRING_LENGTH + 1];
int c;
printf("Please enter a valid string\n");
if (fgets(stringInput, sizeof stringInput, stdin) != NULL) {
// strip the newline character if present
//stringInput[strcspn(stringInput, "\n")] = '\0';
char *p;
for (p = stringInput; *p != '\0' && *p != '\n'); p++)
continue;
*p = '\0';
for (i = 0; stringInput[i] != '\0'; i++) {
newString[i] = switchChar(stringInput[i]);
}
newString[i] = '\0';
printf("\"%s\"", stringInput);
printf("->");
printf("\"%s\"", newString);
printf("\n");
}
return 0;
}
我是一名优秀的程序员,十分优秀!