2012-04-20 3 views
0

. Моя программа .c при создании создает объект «имя». Я должен уметь вызывать разные задачи в зависимости от этого имени. Я очень новичок в этом и пробовал пару способов без успеха. Вот что я придумал.Как проверить, содержит ли переменная строку

if (name == "james"){ 

    //Do a bunch of stuff 
    } 
if (name == "tom"){ 

    //Do a bunch of stuff 
    } 

Это не удалось. Есть ли способ, чтобы, если «имя» - это одно, что он не выполняет других?

Thankyou так много для любой помощи

+3

Также, пожалуйста, не помечать вопросы C, как C++, они полностью отличаются друг от друга языками. – Anthales

+0

Точно. Это C или C++? – davmac

+0

Теперь он был помечен как C, но он не помечен как C++ снова, что происходит? Сначала он сказал, что это «.c-программа», поэтому я предполагаю, что он имел в виду C .. – Anthales

ответ

1

В строке C строка определяется как последовательность символов, которые заканчиваются \0. Строка константа обычно представлена ​​в `», например, обугливается а [10] = „привет“.

Для того, чтобы сравнить две строки, вы можете использовать функции библиотеки как strcmp(), который доступен в string.h. У man strcmp к подробнее об этой функции.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
     char name[] = "tom"; 

     if (strcmp(name, "tom") == 0) { 
      printf("name is tom! \n"); 
     } else if (strcmp(name, "bob") == 0) { 
      printf("name is bob! \n"); 
     } else { 
      printf("who is this?! \n"); 
     } 

     return 0; 
} 

зЬгстр мог быть реализован следующим образом (массив и указатель версии для справки)

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; 
} 
+0

Просто примечание: эти реализации являются полностью одинаковыми (за исключением использования индекса, конечно), потому что вы не можете передавать фактические массивы в качестве параметров функции; они также являются указателями. – Anthales

+0

Решила поблагодарить так много! –

2

Посмотрите на функцию библиотеки strcmp. Когда вы используете ==, вы просто сравните указатели, а не фактический массив строк, лежащий за ними.

+0

Не, если 'name' является строкой, как он утверждает. –

+0

Ну, довольно просто называть символы 'char *' или 'char []' "в C, потому что« указатель на char »или« char array »просто не чувствуют. – Anthales

+0

Да, но то, что обычно бывает в C, иногда очень необычно в C++.Когда речь идет о C++, «строка» обычно означает «std :: string», а '' \ 0'' завершается 'char *' или 'char []' обычно будет называться строками типа C, если контекст isn Совершенно однозначно. –

1

Вы должны использовать strcmp как:

if (!strcmp(name,"james")){ 

Использование == сравнивает содержимое имени (начальный адрес строки) с начальным адресом строковый литерал «Джеймсу», что, безусловно теперь, что вы хотите ,

+0

'strcmp' не работает с строками C++. Его проблема в том, что он не объявлял «имя» правильным типом; если 'name' является' std :: string', его код должен работать. –

+0

@JamesKanze: Вопрос четко говорит о файле '.c', поэтому он говорит о C не C++. – codaddict

+0

Вопрос был четко помечен C++, когда я посмотрел на него. Я предположил, что это означает, что вопрос был о C++. (Я фактически подтвердил, что он не был также отмечен C перед комментированием.) –

3

if 'name' - это строка C++, то, что вы написали, должно работать нормально. Если это char[] или char *, используйте strcmp.

+0

Спасибо за ответ, как бы я использовал это с вышеуказанным кодом? –

+0

Если 'name' не является строкой C++, это должно быть. –

+0

Решила мою проблему, спасибо! –

1

Предполагая, что это стандартная программа .c, и что ваше «имя» является на самом деле char* тогда вы будете иметь, чтобы использовать strings.h стандартной библиотеки C для функции strcmp().

Оператор равенства == предназначен для std::string и других классов строк.

например.

if (strcmp(name,"james")==0){ 
    /* Do stuff */ 
} 

Кроме того, вы могли бы рассмотреть switch условно для нескольких тестов.

+0

'switch' требует интегральных констант. У него нет ни одного из них. –

+0

Очень верно. Я представил себе, что его строки заменены эквивалентными константами ('int JAMES = 1' и т. Д.), Может быть лучше, если смотреть на кажущийся фиксированный поток управления. – timlukins

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