Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf上附加了奇怪的字符串_C_String - Fatal编程技术网

C printf上附加了奇怪的字符串

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

我写了一个简单的程序来切换字符串,我试着在我的电脑和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 (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';