2011-12-29 43 views
0

这足以说我是新的C所以请手下留情)。试图比较两个字符串

我想比较两个字符串。输出不应包含通用字符。可悲的是它。

下面是代码:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    const char msg[15] = "blueberry"; 
    int c; 
    int s[15]; 
    int j = 0; 
    int i = 0; 
    int k= 0; 
    int ok = 0; 
    int t = 0; 

    while (i < 15 && (c = getchar()) != '\n') 
    { 
     s[i] = c; 
     ++i; 
    } 

    for (t=j=0; t < 15; ++t) 
    { 
     ok = 1; 
     //printf ("%c", s[t]); 
    } 

    for (k=0; msg[k] != '\0'; ++k) 
    { 
     if (s[t] == msg[k]) 
     { 
      ok = 0; 
     } 
    } 

    if (ok == 1) 
    { 
     s[j] = s[t]; 
     j++; 
    } 
    s[j] = '\0'; 

    for (j = 0; j < 15; ++j) 
     printf ("%c ", s[j]); 
} 

从键盘输入是blackberry,预期产出应该已经U但可惜事实并非如此。请任何帮助。此外为什么它进入嵌套循环for不论条件?


我非常感谢大家,它帮了我很多。我已经想通了的方式&上午确定与输出。我借用了A4L的一些想法:)。

+0

你忘了告诉我们究竟是代码试图做什么,而恰恰是它做了什么。我可以想到很多输出'U'的代码。而且我也可以考虑很多不输出'U'的代码。 –

+0

有一个}关闭错位。 if(ok == 1)应该在for循环中。 – BigMike

+0

您在s []中填写用户的输入,但您检查了msg []。为什么? –

回答

1

若要比较两个字符串,可以使用strcmp()

以下是可供您参考的字符串比较程序。为了更好的理解,我有数组和指针版本。

#include <stdio.h> 

int strcmp1(char a[], char b[]) 
{ 
     int i=0; 
     while (a[i] == b[i]) { 
       if (a[i] == '\0') 
         return 0; 
       i++; 
     } 

     return a[i]-b[i]; 
} 

int strcmp2(char *a, char *b) 
{ 
     while (*a == *b) { 
       if (*a == '\0') 
         return 0; 
       a++; b++; 
     } 
     return *a-*b; 
} 

int main() 
{ 
     char s1[] = "test string1"; 
     char s2[] = "test string"; 
     char s3[] = "aaa"; 
     char s4[] = "bbb"; 

     printf("strcmp1(%s, %s) = %d \n", s1, s2, strcmp1(s1, s2)); 
     printf("strcmp2(%s, %s) = %d \n", s3, s4, strcmp2(s3, s4)); 

     return 0; 
} 
+0

是的,那么输出不是在两个字符串中的字符怎么样? – BigMike

+0

@BigMike我只是想给作者一个参考/提示,尝试和学习字符串操作C –

+0

非常感谢大家。这对我帮助很大。再次感谢! – user1115145

-1

你的代码,甚至重写后一片狼藉 - 有太多的错误,详细描述

/* 
blackbery 
b l u e b e r r y 
. . a c k b e . . 
result = non-equal 
*/ 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
const char msg[15] = "blueberry"; 
int c, s[15], i,j,k, ok; 

for (i=0; i < 15; i++) s[i] = 0; 
for (i=0; i < 15 && (c = getchar()) != '\n'; i++) s[i] = c; 

for (ok=1, k=0; msg[k] != '\0'; ++k) 
    if (s[k] != msg[k]) ok = 0; else s[k] = '.'; 

for (j = 0; j < 15; ++j) printf ("%c ", msg[j]); 
printf("\n"); 

for (j = 0; j < 15; ++j) printf ("%c ", s[j]); 
printf("\nresult = %s\n", ok ? "equal" : "non-equal"); 
} 
+0

那么你提出的实际答案是什么? – JeremyP

+0

清理海报预期的原始代码。从我的角度来看,“levenstein距离”比较两个字符串的目标更合适。 (我的意思是原始帖子的作者想要显示字符串之间的区别,恕我直言)。 – Vlad

+1

是的,我同意他做了,但你所做的只是发布了一些代码,没有任何解释。 – JeremyP

0

因为味精中含有“蓝莓”和s包含“黑莓”这个应该这样做

for (int i=0; i < strlen(msg); i++) { 
    for (int j = 0; j < strlen(s); j++) { 
    if (msg[i] != s[j]) { 
     printf ("%c", msg[i]); 
    } 
    } 
} 

是它的丑陋(使用了strlen的给我发冷,但今天我对咖啡因仍然较低^^)

0

我想你想找到的第一个字母,其中输入从消息

这里不同的是您自己的代码有一些修正

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
const char msg[15] = "blueberry"; 
int c; 
char s[15]; 
int i = 0; 
int k= 0; 
int ok = 0; 


while (i < 15 && (c = getchar()) != '\n') 
{ 
    s[i] = (char) c; 
    ++i; 
} 

// make sure to terminate the string after hitting enter 
s[i] = '\0'; 

printf("input: %s\n", s); 
printf("messg: %s\n", msg); 

// run through both input and message with one counter 
for (k=0; ok == 0 && msg[k] != '\0' && s[k] != '\0';) 
{ 
    // if different chars stop 
    if (s[k] != msg[k]){ 
     ok = 1; 
    } else { 
     // next char 
     k++; 
    } 
} 
if (ok == 1) 
{ 
    printf ("diff @ index %d -> %c\n", k, msg[k]); 
} 
else 
{ 
    printf ("no diff\n"); 
} 

return 0; 
} 
0
#include <stdio.h> 
#include <string.h> 

//Length to match 
int comm(char* s1, char* s2){ 
    int len = 0; 
    while(*s1 && *s2 && *s1++ == *s2++) 
     ++len; 
    return len; 
} 
//commdiffcomm 
/* 
int commr(char* s1, char* s2){ 
    int len = 0, limit; 
    int len1,len2; 
    len1 = strlen(s1); 
    len2 = strlen(s2); 
    limit = len1 > len2 ? len2 : len1; 
    s1 = s1 + len1; 
    s2 = s2 + len2; 
    while(limit-- && *--s1 == *--s2) 
     ++len; 
    return len; 
} 
//bad 
int diff(char* s1, char* s2, int* len1, int* len2){ 
    int len, lenr, s1_len, s2_len, wk_max, i, j; 

    len = comm(s1, s2); 
    if(strcmp(s1, s2)==0){ 
     *len1 = *len2 = 0; 
     return len; 
    } 
    lenr = commr(s1, s2); 
    *len1 = strlen(s1) - len - lenr; 
    *len2 = strlen(s2) - len - lenr; 
    return len; 
} 
*/ 
int diff(char* s1, char* s2, int* len1, int* len2){ 
    int len, s1_len, s2_len, wk_max, i, j; 

    len = comm(s1, s2); 
    if(strcmp(s1, s2)==0){ 
     *len1 = *len2 = 0; 
     return len; 
    } 
    s1_len = strlen(s1 + len + 1); 
    s2_len = strlen(s2 + len); 
    wk_max = 0; 
    for(i = 1; i < s1_len ; i++){ 
     for(j = 0; j < s2_len; j++){ 
      int com_len; 
      com_len = comm(s1 + len + i, s2 + len + j); 
      if(wk_max < com_len){ 
       wk_max = com_len; 
       *len1 = i; 
       *len2 = j; 
      } 
     } 
    } 
    return len; 
} 

int main(){ 
    char str1[16] = "blueberry"; 
    char str2[16] = "blackberry"; 
    char dif1[16] = ""; 
    char dif2[16] = ""; 
    int len0;//length of top to diff pos 
    int len1; 
    int len2; 

    len0 = diff(str1, str2, &len1, &len2); 
    strncpy(dif1, str1 + len0, len1); 
    strncpy(dif2, str2 + len0, len2); 
    if(len1 !=0 && len2 != 0){ 
     printf("%s different %s at position %d length %d (\"%s\")\n", str1, str2, len0, len1, dif1); 
     printf("%s different %s at position %d length %d (\"%s\")\n", str2, str1, len0, len2, dif2); 
    } else { 
     printf("two string is same."); 
    } 
    return 0; 
} 

/* 
blueberry different blackberry at position 2 length 2 ("ue") 
blackberry different blueberry at position 2 length 3 ("ack") 
*/ 
0

没有与代码的几个问题是:

  • 您不会null-terminate您的输入字符串。试图与c字符串函数一起使用会带来麻烦。为了解决这个问题,改变

    while (i < 15 && (c = getchar()) != '\n') 
    { 
        s[i] = c; 
        ++i; 
    } 
    

    while (i < 14 && (c = getchar()) != '\n') 
    { 
        s[i] = c; 
        ++i; 
    } 
    s[i] = '\0'; 
    
  • 你的规格还不清楚,你是否希望你的程序打印独特的字母msg,或同时smsg。 (即,你想msg-s(msg ∪ s)-(msg ∩ s)假设第一,程序的重要组成部分,是这样的:

    k=0; 
    for(i=0;i<strlen(msg);i++){ 
        int exists = 0; 
        for(j=0;!exists && j<strlen(s);j++){ 
         if(msg[j] == s[i]) 
          exists = 1; 
        } 
        if(!exists) 
         msg[k++] = msg[i]; 
    } 
    s[k] = '\0'; 
    

    内环检查s包含msg当前字符。如果确实如此,我们什么都不做,但如果没有,我们会将其追加到我们已经处理的msg位的顶部创建的子列表的末尾。