c - 为什么输出末尾有随机字符?

标签 c

我试图解决 toph.co 平台中的问题。我做了一个代码。它没有按应有的方式工作。在某些情况下给我正确的输出。但是当我尝试使用“o”的情况时,它会进入循环。也许问题就在那里。但我无法找到答案。

问题链接:https://toph.co/p/better-passwords

请帮我解决我的代码中的问题。我正在使用c 编程语言。由于我是编程新手,我没有得到错误的观点。

我尝试过很多方法。一次又一次的修改代码。现在我快疯了。

#include <stdio.h>
#include<string.h>

int main()
{
    char s[40], i, j;
    int len;
    gets(s);
    len= strlen(s);
    for(i=0; i<=len; i++)
    {
        if(s[i] == 's')
        {
            s[i]= '$';
        }
        else if(s[i] == 'i')
        {
            s[i]= '!';
        }
        else if(s[i] == 'o')
        {
            s[i]= '(';
            for(j=len; j>i; j--)
            {
                s[j]=s[j-1];
                len= strlen(s);
            }
            s[i+1]=')';
        }
        else
        {
            continue;
        }
        len= strlen(s);
    }
    if (s[0]>='a' && s[0]<='z')
    {
        s[0]= s[0]- 32;
    }
    int new_len=strlen(s);
    s[new_len]='.';
    puts(s);
    return 0;
}

我期望输出 Un$()ph!$t!cated。 ,但它显示 Un$()ph!$t!cated...'许多不需要的字符'...

最佳答案

您的字符串空字节在操作后丢失,避免此类问题的最简单方法 - 是将整个字符数组初始化为零字节:

char s[40] = {0}, // was char s[40], uninitialized !

您是否还注意到一条编译消息“警告:‘gets’函数很危险,不应使用”?

gets() 是危险的,因为它没有受到缓冲区溢出的保护 - 尝试使用超出缓冲区 s 容量的非常长的字符串来运行程序,您将得到崩溃:

* stack smashing detected *: terminated Aborted (core dumped)

使用 fgets() 而不是 gets(),如下所示:

fgets(s, 39, stdin);
if (s[strlen(s)-1] == '\n') s[strlen(s)-1] = '\0'; // deleting newline character

注意,我们在这里读到 BUFFER_SIZE - 1 个字符,即比缓冲区能够容纳的字符 (40) 少 1 个字符,因为如果我们输入已满的长字符串缓冲区大小,-那么你的代码扩展字符串将再次粉碎堆栈。您需要认真对待缓冲区溢出。

关于c - 为什么输出末尾有随机字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58279910/

相关文章:

c - 查看存储在内存中的值以检查字节序?

Cygwin Gcc - 访问

c++ - C++ 字符串和 C 字符串 ( .c_str() ) 之间的区别

同步闪存驱动器的 C 代码

c - 从 C 移植学习 Rust

c - 什么时候可以将 C 中的函数作为系统调用来调用

c - ncurses透明控制台背景

c execvp grep环境变量,当grep没有找到任何东西时

c - 是否可以在 google 中搜索 C 而不会在结果中得到 C++?

c - 如何使用 scanf 函数获取具有 50 或更多数字的大输入