C printf上附加了奇怪的字符串
我写了一个简单的程序来切换字符串,我试着在我的电脑和IDEOne中,我收到一个奇怪的字符串附加到输出。我错过什么了吗C printf上附加了奇怪的字符串,c,string,C,String,我写了一个简单的程序来切换字符串,我试着在我的电脑和IDEOne中,我收到一个奇怪的字符串附加到输出。我错过什么了吗 #include <stdio.h> int main (int argc, char *argv[]) { char input[100], output[100]; int length; scanf("%s", input); length = sizeof(input)/sizeof(input[0]); for
#include <stdio.h>
int main (int argc, char *argv[]) {
char input[100], output[100];
int length;
scanf("%s", input);
length = sizeof(input)/sizeof(input[0]);
for (int i = 0; input[i] != '\0'; i++) {
if (input[i] >= 97 && input[i] <= 122) {
output[i] = input[i] - 32;
} else if (input[i] >= 65 && input[i] <= 90) {
output[i] = input[i] + 32;
}
}
printf("%s\n", output);
return 0;
}
#包括
int main(int argc,char*argv[]){
字符输入[100],输出[100];
整数长度;
扫描频率(“%s”,输入);
长度=sizeof(输入)/sizeof(输入[0]);
对于(int i=0;输入[i]!='\0';i++){
如果(输入[i]>=97&&input[i]=65&&input[i]%s
需要一个以null结尾的字符串作为参数。您必须在输出
的末尾附加一个'\0'
字符。因此,printf
需要一个以0结尾的字符,而不是终止输出
,也就是说,您不需要编写最后的\0
-字符一个简单的解决方案是将output
定义为
char output[100] = { 0 };
因此,output
将被\0
填充,您之前写入的任何内容都将找到结尾
正如评论中指出的,代码中还有一些问题可能导致未定义的行为或意外结果
首先,如果输入超过99个字符(然后产生未定义的行为),将导致缓冲区溢出。您可以使用scanf(“%99s”,input)
避免这种情况
第二,如果输入包含一些未触发切换表达式的字符,则可能会得到意外的短结果。在代码中,output
将在相关位置包含垃圾;在output={0}
-变量中,结果将在此时“结束”。因此,类似于“abc1234DEF”的输入
可能分别产生“ABC?@:-def”
或“ABC”
。添加一个否则{output[i]=input[i];}
第三,length=sizeof(input)/sizeof(input[0])
将始终返回100
,而与实际输入的字符数无关。请注意,sizeof(input)
将100
和sizeof(input[0])
将1
作为编译时常数。要获取“长度”使用strlen(输入)
,以输入的字符数表示字符串的长度
intmain(intargc,char*argv[]){
字符输入[100],输出[100]={0};
扫描频率(“%99s”,输入);
尺寸长度=strlen(输入);
for(int i=0;i 如果(input[i]>=97&&input[i]=65&&input[i]在你的循环之后,我又是一个,也就是说,你只需要把
输出[i]='\0'
问题的答案是:
输出[]数组必须以NUL(0x00)结尾。
调用printf()
中的“%s”格式说明符在遇到NUL之前不会停止输出字节
由于发布的代码未能设置所需的NUL字节,“%s”将继续输出字节,直到它发生在某个随机NUL字节上。
这是未定义的行为,可能导致seg故障事件
您可以通过以下方式解决此问题:
在for()
代码块之后和printf()
语句之前,插入以下语句:
output[i] = '\0';
琐事:每个C字符串的结尾应该是什么?真的,你似乎都知道。有效的输入字符是99个字符。如果结束,缓冲区溢出。请尝试scanf(“%s”,input);
-->scanf(“%99s”,input)
请记住,如果输入包含您选择不复制到输出的字符,您永远不会为输出字符串中的匹配索引赋值。这会使您的输出包含未初始化的字符,这将在您尝试显示它时导致未定义的行为。仅供参考,查找字符串长度的正确方法由我们提供e strlen()函数。我注意到int length
变量的初始化,但它没有在任何地方使用。我认为这是因为它没有提供您所期望的。变量length
正在设置,但从未使用过。是的,但在OP的ideone示例中,输入部分发生缓冲区溢出。因此,您需要首先修复它t、 请注意,如果输入包含非大写或小写字母(例如数字或标点符号)的内容,则输出中的间隙不会被覆盖。虽然此解决方案确实比初始示例有显著改进(至少不太可能有未定义的行为)它仍然不会给出结果OP似乎是试图实现。@弗兰Sou-OIS and Adulux:没错,虽然OP的样本没有包含这样的输入。无论如何,有必要考虑这样的情况。+ 1我喜欢你的答案。除了避免魔法数字,<代码>输入[i] >=97 & &输入[i]没有添加先前答案中未包含的内容。Downvote,因为此答案不尝试解释任何内容。我没有Downvote。但是I
在after for-loop中未声明。感谢-user4581301让我知道,我还必须为我的答案解释抱歉,因为我使用stackoverflow的次数很少,所以我不知道如何回答这些问题性病。。。
output[i] = '\0';