gpt4 book ai didi

c - 字符串的 Printf 不情愿地下降一行

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:48 24 4
gpt4 key购买 nike

这是我的程序(学校练习,应该是从用户那里接收一个字符串,更改它并以某种格式返回原始字符串和新字符串):

#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;
}

关于c - 字符串的 Printf 不情愿地下降一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40743292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com