我试图解决 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/