2012-06-29 21 views
0

所以我想在K & R做練習練習。它想讓我做一個類似於擠壓的功能,我不知道它有什麼問題。我的桌子已經檢查過了。我不想在網絡上找到解決方案,我想明白爲什麼我的代碼不會工作。用戶定義的功能類似於擠壓()

//removes characters that are present in both strings 
#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#define MAXLTR 15 

void removesame(char s1[],char s2[]); 

int main(void) 
{ 
    char string1[MAXLTR],string2[MAXLTR]; 
    printf("Enter a string: "); 
    scanf("\n%s",&string1); 
    printf("\nEnter the letters/words to be removed: "); 
    scanf("\n%s",&string2); 
    removesame(string1,string2); 
    printf("\nFinal output: %s",string1); 
    getch(); 
} 

void removesame(char s1[],char s2[]) 
{ 
    char temp[MAXLTR]; 
    int arraycntr,comparecntr; 
    for(comparecntr = 0; comparecntr < MAXLTR; comparecntr++) 
    { 
     for(arraycntr = 0;arraycntr < MAXLTR;arraycntr++) 
     { 
      if(s1[arraycntr] == s2[arraycntr]) 
       s1[arraycntr] == '\t'; 
     } 
    } 
    comparecntr = 0; 
    for(arraycntr = 0; arraycntr < MAXLTR; arraycntr++) 
    { 
     if(s1[arraycntr] != '\t') 
     { 
      temp[comparecntr] = s1[arraycntr]; 
      ++comparecntr; 
     } 
    }   
    for(arraycntr = 0; arraycntr < MAXLTR; arraycntr++) 
     s1[arraycntr] = '\0'; 
    for(arraycntr = 0;arraycntr < MAXLTR; arraycntr++) 
     s1[arraycntr] = temp[arraycntr]; 

} 
+0

BTW不介意的#include 我只是把它放在那裏,因爲我用的strcpy()來查看如果最後一部分是錯誤的。 – latenightcode

+0

如果你的編譯器沒有給出s1 [arraycntr] =='\ t'的警告;'它可能是非常糟糕或者配置不正確。你應該得到一個警告,說「空聲明」,「代碼沒有作用」等。 – Lundin

回答

3

這不是一個任務,而是一個平等的測試:

s1[arraycntr] == '\t'; 

你的意思是:

s1[arraycntr] = '\t'; 

如果高警戒線編譯,編譯器可能會發出消息提醒你這一點。微軟VC編譯發出以下警告:

C:\ devel的\ CPP \計算器\ main.c中(32):警告C4553: '==':操作者沒有影響;你打算'='?

初始for循環只檢查是否s1s2在同一指標相同的值,它不檢查是否在s1一個char在任何地方s2存在。在for循環的終止條件,也應該是s1長度和s2,不MAXLTR:下for循環應當使用strlen(s1)

size_t arraycntr,comparecntr; 
for(comparecntr = 0; comparecntr < strlen(s2); comparecntr++) 
{ 
    for(arraycntr = 0;arraycntr < strlen(s1) ;arraycntr++) 
    { 
     if(s1[arraycntr] == s2[comparecntr]) 
      s1[arraycntr] = `\t`; 
    } 
} 

,只是後分配空終結於temp

comparecntr = 0; 
for(arraycntr = 0; arraycntr < strlen(s1); arraycntr++) 
{ 
    if(s1[arraycntr] != `\t`) 
    { 
     temp[comparecntr] = s1[arraycntr]; 
     ++comparecntr; 
    } 
} 
temp[comparecntr] = '\0'; 

temp不在任何地方初始化,因此包含隨機數據,除了在for期間剛輸入的數據。如果在temp中沒有空終止符,s1也將以無空終止符結束(以後可能會看到垃圾回收)。最後,只是strlen(temp) + 1填充s1時:

for(arraycntr = 0;arraycntr < strlen(temp) + 1; arraycntr++) 
    s1[arraycntr] = temp[arraycntr]; 

+ 1將空終止複製到s1

小紙條,而不是在for循環的終止條件調用strlen()你可以存儲這個代替:

size_t chars_to_copy; 
for(arraycntr = 0, chars_to_copy = strlen(temp) + 1; 
    arraycntr < chars_to_copy; 
    arraycntr++) 
{ 
    s1[arraycntr] = temp[arraycntr]; 
} 
+0

謝謝!沒有注意到,但它仍然不會工作:/ im試圖找出什麼是錯誤的邏輯 – latenightcode

+0

@vincentbelkin,更新的答案。 – hmjd