2014-10-11 6 views
0

Этот код в основном возвращает уникальную строку. Таким образом, результирующая строка имеет только уникальные символы.Неожиданный вывод из простой программы C

Ввод: «Это пример ввода» Выход: «this anexmpl». Но я тоже должен получить «u». Он отлично работал с другими 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

Эта строка: для (int t = reslength-1; t> = 0; t -) {неверна. Причина, по которой это неверно, - это значение reslength - фактическое смещение (оно начиналось с 0) в массив для последнего символа. Таким образом, строка должна быть: for (int t = reslength; t> = 0; t -) { – user3629249

ответ

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

Всегда исправляйте предупреждения компилятора, даже если они не кажутся проблематичными с первого взгляда - в один прекрасный день это может спасти вашу жизнь (или, по крайней мере, вашу работу).

Смежные вопросы