此代码基本上返回一个唯一的字符串。因此,结果字符串只有唯一的字符。
输入:“这是一个示例输入”输出:“this anexmpl”。但我也应该得到一个'你'。 它与其他IDE一起工作正常。我刚刚下载了devcpp 4.9.9.2,我将它用作IDE。 代码工作正常。
#include<stdio.h>
#include<conio.h>
#include<string.h>
int search(char result[30],char temp)
{
for(int i=0;result[i];i++){
if(temp == result[i])
return 0;
}
return 1;
}
int main()
{
char str[20];
printf("\nEnter String: ");
gets(str);
//scanf("%[^\t\n]s",str);
//strlwr(str);
for(int i=0;i<strlen(str);i++){
if(str[i]>=65 && str[i]<=90)
str[i]=str[i]+32;
}
int length=0;
for(int i=0;str[i];i++)
length++;
char result[30];
result[0]='\0';
int ctr=0;
for(int j=0;str[j];j++){
if(search(result,str[j]) == 1){
printf("%c\t",str[j]);
result[ctr]=str[j];
ctr++;
}
}
result[ctr]='\0';
printf("\nUnique String:");
printf("\n%s\n",result);
char reverse[20];
int reslength=0;
for(int k=0;result[k];k++)
reslength++;
int counter=0;
printf("Reversed String:\n");
for(int t=reslength-1;t>=0;t--){
printf("%c",result[t]);
}
getch();
return 0;
}
答案 0 :(得分:3)
一个直接问题是str
在20个字符处太小 - 您的输入字符串比这大得多,因此您有缓冲区溢出因此未定义的行为。变化:
char str[20];
到,例如:
char str[256];
另外:永远不要使用gets
- 请改用fgets
。变化:
gets(str);
为:
fgets(str, sizeof(str), stdin);
如果输入字符串太长,那么你就不能获得缓冲区溢出。
关于编程风格的另一点 - 永远不要对字符使用硬编码的ASCII常量 - 它没有意义,不可移植,难以阅读/维护 - 所以改变,例如:
if(str[i]>=65 && str[i]<=90)
str[i]=str[i]+32;
为:
if(str[i]>='A' && str[i]<='Z')
str[i]=str[i]-'A'+'a';
或更好的是,使用<cytpes.h>
并使用以下内容删除上述两行:
str[i] = tolower(str[i]);
最后一条忠告:始终启用编译器警告并注意它们 - 您的代码会生成多个警告,在这种情况下,这些警告都不是严重的,例如:
main.c:39:10: warning: unused variable 'reverse' [-Wunused-variable]
char reverse[20];
^
main.c:43:9: warning: unused variable 'counter' [-Wunused-variable]
int counter=0;
^
总是修复编译器警告,即使它们一眼看上去不成问题 - 有一天这可能会挽救你的生命(或者至少是你的工作)。