2015-11-24 36 views
-1

我是C新手,而且我正在創建庫來處理字符串。比較C中的字符會拋出錯誤

現在我正在創建一個名爲'indexOf'的函數,它返回字符放置在字符串中的索引。

的main.c(讀碼有關錯誤信息評論)

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

int main() 
{ 
    char name[] = "Juan"; 
    printf("The char 'a' is in the index %d \n\n", indexOf(name, 'a')); 

    return 0; 
} 

jstring.h

#include <string.h> 

int indexOf(char haystack[], char needle) 
{ 
    int index = 0; 
    while(haystack[index] != '\0') 
    { 
     //Prints char by char untill the needle is found (for testing) 
     printf("%c\n", haystack[index]); 

     if(strcmp(haystack[index], needle) == 0) //Causes error (app strops working) 
     { 
      printf("Needle found!"); 
      return index; 
     } 
     index++; 
    } 
    return -1; 
} 

如果我用下面的代碼,這是行不通的

if(haystack[index] == needle) //Is never true 
{ 
    printf("Needle found!"); 
    return index; 
} 

程序我知道名稱是「胡安」應該返回2作爲字符'a'的位置的索引。我不知道這段代碼有什麼問題,我已經習慣了指針,也許是與此相關的東西。

我已經搜索了很多關於比較字符的StackOverflow問題,但還沒有找到最後沒有用到的strcmp()或與我的函數類似的目標。

+3

不要把函數定義在頭文件,如果你想代碼分割成多個文件,然後使用您鏈接在一起兩個源文件,並只將函數原型聲明放在頭文件中。 –

+0

我也可能會開始閱讀最佳實踐。我習慣於其他語言,因爲我是網絡開發人員,但這是我第一週C –

+2

C具有[*翻譯單元*](https://en.wikipedia.org/wiki/Translation_unit_%28programming)的概念%29)。翻譯單元基本上是一個包含所有頭文件的單一源文件。編譯器使用這個翻譯單元並創建一個目標文件,然後將其饋入鏈接器,該鏈接器將所有目標文件和外部庫鏈接到一個可執行程序中。這些大部分都是由編譯器前端程序隱藏的。 –

回答

1

strcmp需要兩個指向char的指針,但是你給它兩個字符。相反,與平等==運算符進行比較。

用==試過了你的版本,它適用於我。無法重現,這沒有找到您的索引。

+1

如果(haystack [index] ==針)? –

+0

是的。無法重現它沒有找到您的索引。對我來說,它會打印Needle找到!字符'a'在索引2中 –

+0

對不起,我不知道發生了什麼事,我改變了一些東西后再次重新測試,現在,如你所說,它運行良好。無法知道它是否是一個錯字或什麼的。我現在感到非常慚愧。 –

2

首先,你不能使用的needle

if(strcmp(haystack[index], needle) == 0) 

東陽不是null結尾的字符串。它們都不是haystack[index]。要在strcmp中使用haystack[index],您必須使用&haystack[index]

其次,用簡單的==作品代碼以及

int indexOf(char haystack[], char needle) 
{ 
    int index = 0; 
    while(haystack[index] != '\0') 
    { 
     //Prints char by char untill the needle is found (for testing) 
     printf("%c\n", haystack[index]); 

     if(haystack[index] == needle) 
     { 
      printf("Needle found!\n"); 
      return index; 
     } 
     index++; 
    } 
    return -1; 
} 
int main() 
{ 
    char name[] = "Juan"; 
    printf("The char 'a' is in the index %d \n\n", indexOf(name, 'a')); 

    return 0; 
} 
+0

對不起,我不知道發生了什麼事,我改變了一些東西后再次重新測試,現在,如你所說,它運作良好。無法知道它是否是一個錯字或什麼的。我現在感到非常慚愧。 –

+0

「因爲針不是以空字符結尾的字符串。」 - 乾草堆[索引]也不是。恕我直言,這兩個錯誤都應該指出,否則新手讀者可能會認爲第一個參數是好的。 –

+0

@LudwigSchulze在發佈的代碼中,'haystack'是'null'終止的。你在看什麼? – LPs