2015-04-05 172 views
0

所以我可能会攻击这个错误的方式;我正在学习一些Javascript,并编写了一个程序,该程序将查找另一个字符串中包含的字符串,并将匹配存储在一个数组中(如果没有太大意义,请参阅我的程序应该帮助)。我试图将我的程序翻译为C,但它不起作用;我想我的问题是数据类型:C程序在字符串中查找子字符串

int main() { 
    char text[58]; 
    strcpy(text, "I am James, James the Great, a pretty cool guy named James"); 
    char store[16]; 
    char name[6] = "James"; 
    for (int i = 0; i <= 16; i++) { 
     if (text[i] == 'J') { 
      for (int k = i; k < i + 6; k++) { 
       store[k] = text[i]; 
       } 
     } 
    } 
    int a = sizeof(store)/sizeof(store[0]); 
    for (int b = 0; b < a; b++) { 
     /* This should print out the values stored in the store array */ 
     printf("%d", store[b]); 
    } 
    return 0; 
} 

我预期的结果会是这样的:

JamesJamesJames 

相反,我得到:

10000747474747474-6374747474 

所以我假设它在做什么我告诉它这样做,只是不把字母作为字母存储到数组中,有点令人困惑。有一个更好的方法吗?

这是JavaScript代码,我试图翻译:

var text = "I am James, James the Great, a pretty cool guy named James"; 

var myName = "James"; 
var hits =[]; 
for (i = 0; i < text.length; i++) { 
    if (text[i] === "J") { 
     for (var j = i; j < i + myName.length ; j++) { 
      hits.push(text[j]); 
     } 
    } 
} 
if (hits.length === 0) { 
    console.log("Your name wasn't found!"); 
} else{ 
    console.log(hits); 
} 
+1

0)' “%d”' - >' “%C”' – BLUEPIXY 2015-04-05 16:38:55

+0

是有一些问题,简单地使用系统功能:)的strstr(? – user3629249 2015-04-05 20:44:54

回答

0

你犯了下列错误。

for (int i = 0; i <= 16; i++) 

您重复'16',但这是不正确的文本长度。

for (int k = i; k < i + 6; k++) 

所以你迭代的 “I,I + 1,I + 2,i + 3中,I + 4,I + 5,I + 6” 在这里是7个字符, “詹姆斯” 有6

store[k] = text[i]; 

你不改变“我”的价值,所以文字[我]总是返回'J'。最好使用savePoistion变量,所以在下面的代码中。

int a = sizeof(store)/sizeof(store[0]); 
    for (int b = 0; b < a; b++) { 
     /* This should print out the values stored in the store array */ 
     printf("%d", store[b]); 
    } 

我不知道你在这里做什么。这真的没有必要。

printf("%d", store[b]); 

“%d”表示您正在打印整数,因此不要惊讶您的输出是数字。只需简单地printf(“%s \ n”,store);

这看起来应该是这样

int main() { 
    char text[58]; 
    strcpy(text, "I am James, James the Great, a pretty cool guy named James"); 
    char store[20]; 
    int len = strlen(text); 
    int savePosition = 0; 

    int i, k; 
    for (i = 0; i < len; i++) { 
     if (text[i] == 'J') { 
      for (k = i; k < i + 5; k++) { 
       store[savePosition] = text[k]; 
       ++savePosition; 
       } 
     } 
    } 
    store[savePosition] = '\0'; 
    printf("%s\n", store); 
    return 0; 
} 
+0

是的,我认为我早些时候把它作为%s,但它意外变成了%d。非常感谢你,很好的回答,并且很容易遵循! – steelcowboy 2015-04-05 17:45:28

0
int main (void) { 
    char text[] = "I am James, James the Great, a pretty cool guy named James"; 
    char name[] = "James"; 
    char store[16] = {0}; 
    int store_index = 0; 
    for (int i = 0; i < strlen(text); i++) { 
     if (text[i] == 'J') { 
      for (int k = i; k < i + strlen(name); k++) { 
       store[store_index++] = text[k]; 
      } 
     } 
    } 
    if(strlen(store)==0) { 
     printf("Your name wasn't found!\n"); 
    } else { 
     printf("%s\n", store); 
    } 
    return 0; 
} 

重写版本。

int main (void) { 
    char text[] = "I am James, James the Great, a pretty cool guy named James"; 
    char name[] = "James"; 
    char store[sizeof(text)]; 
    char *p = strstr(text, name); 
    if(p == NULL) { 
     printf("Your name wasn't found!\n"); 
    } else { 
     int len = strlen(name); 
     int index = 0; 
     do { 
      memcpy(store + index, name, len); 
      index += len; 
      p = strstr(p + len, name); 
     } while(p != NULL); 
     store[index] = 0; 

     printf("%s\n", store); 
    } 
    return 0; 
} 
+1

只是打了一个更好的答案,但我建议'for(int i = 0; i <= strlen(text)-strlen(name); i ++)' – 2015-04-05 16:57:06

+0

@WeatherVane是的,这段代码有问题。但我试图翻译JavaScript版本。 – BLUEPIXY 2015-04-05 16:59:11

+0

伟大的代码,但有点难以关联的JavaScript哈哈。但是,这绝对会帮助我更好地感受C,谢谢! – steelcowboy 2015-04-05 17:54:58

1

你要打破store[]这一行

for (int k = i; k < i + 6; k++) { 

,因为你写相同的索引您发现文中的text[]。您还一环太多次(6)

int ind = 0; 
for (int k = 0; k < 5; k++) { 
    store[ind++] = text[i+k]; 
} 

然后你的下一个语句不告诉你有关的任何数据收集你

int a = sizeof(store)/sizeof(store[0]); 

只是将其删除,并从store[]打印ind字符。