简单C程序的意外输出

时间:2014-10-11 10:05:42

标签: c

此代码基本上返回一个唯一的字符串。因此,结果字符串只有唯一的字符。

输入:“这是一个示例输入”输出:“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;
}

1 个答案:

答案 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;
         ^

总是修复编译器警告,即使它们一眼看上去不成问题 - 有一天这可能会挽救你的生命(或者至少是你的工作)。