我正在和在线法官做一些测试,我的代码如下:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int i;
char mystring[100];
scanf("%s",mystring);
char newString[strlen(mystring)];
for(i=0;i<strlen(mystring);i++){
if(mystring[i]==toupper(mystring[i])){
newString[i] = tolower(mystring[i]);
}else{
newString[i] = toupper(mystring[i]);
}
}
printf("%s",newString);
}
该代码将大写字符更改为小写,将小写字符更改为大写,问题是编译时它会抛出我在字符串末尾添加一个奇怪的字母:
入口:
RrHRxcUsSrvSnTyolvsxHoGyzwBMzuLCUjcSeWmBAhodtEkgZjDkFjaXXAvjTvRfHuHGtopoxaeONzFFurfNlRdAvRYlnlfdIMSI
预期输出:
rRhrXCuSsRVsNtYOLVSXhOgYZWbmZUlcuJCsEwMbaHODTeKGzJdKfJAxxaVJtVrFhUhgTOPOXAEonZffURFnLrDaVryLNLFDimSi
我的输出:
rRhrXCuSsRVsNtYOLVSXhOgYZWbmZUlcuJCsEwMbaHODTeKGzJdKfJAxxaVJtVrFhUhgTOPOXAEonZffURFnLrDaVryLNLFDimSiÿ
正如你所看到的,它完美地完成了它的工作,除了它产生一个“ÿ”,这是从哪里来的?
从我自己的 PC 编译它时,我看不到这个符号,但这可能是因为它不在我的 PC 上的字母表中,或者 IDE 不支持它。
我可以通过简单地从数组中删除字符来解决这个问题,因为它总是会发生,但这仍然不应该发生。
发生的情况是字符串,也就是
string
键盘输入的那个,占了101个字符,但是数组只支持100个。在C语言中,所有字符串的末尾多了1个字符,称为零条\0
,这意味着 which 在十六进制中是\x00
,这就是为什么它占用 101 即使它是 100。例如,要写
Hola
,字符串占用 5 个字符,Hola\0
.我把例子留在这里。
该字符串产生以下错误:
char mystring[100]={"RrHRxcUsSrvSnTyolvsxHoGyzwBMzuLCUjcSeWmBAhodtEkgZjDkFjaXXAvjTvRfHuHGtopoxaeONzFFurfNlRdAvRYlnlfdIMsI"};
附加数据:如何解决这个问题?
将长度增加到 101 个字符
将值
0
(零)放在最后一个位置。该函数
printf
被编程为不显示\0
,因此必须\0
在每个字符串的末尾输入。实际上,这个函数试图显示的是指针的内容char
,因为这些在Cstrings
中不存在,但在C++中存在。制作自己的函数来显示它们还不错,但结果是一样的,也不会影响性能。您还可以创建一个自动添加的函数
\0
,以便代码更清晰。所有数组的末尾都有一个空字符,您必须尊重它,并记住所有数组(或您喜欢称它们的数组)都从 0 开始,因此 100 的数组可以填充从 0 到 98 的 99 个空格,但不能填充 99
作为个人经验,我建议你用 for 或 if 编写条件,如果它达到极限,它会自动跳转