Массив строк копируется на каждой итерации с текущим значением [duplicate]

Я получаю вывод как 4. Каково объяснение этого?

В стандарте нет информации о том, как bitset должно быть реализовано. Это определенная реализация, посмотрите на bitset header вашего компилятора.

Также существует метод выделения пространства в битах в C ++?

Нет, там это не метод выделения пространства в битах в C ++.

133
задан Lundin 22 May 2017 в 09:27
поделиться

6 ответов

Используйте strcmp .

Это в библиотеке string.h и очень популярно. strcmp возвращает 0, если строки равны. См. этот для лучшего объяснения того, что возвращает strcmp.

В принципе, вы должны сделать:

while (strcmp(check,input) != 0)

или

while (!strcmp(check,input))

или

while (strcmp(check,input))

Вы можете проверить этот , учебник на strcmp.

4
ответ дан Community 15 August 2018 в 15:25
поделиться

Хорошо, несколько вещей: gets является небезопасным и его следует заменить на fgets(input, sizeof(input), stdin), чтобы вы не получили переполнение буфера.

Затем, чтобы сравнить строки, вы должны использовать strcmp, где возвращаемое значение 0 указывает, что две строки совпадают. Использование операторов равенства (т. Е. !=) сравнивает адрес двух строк, в отличие от отдельных char s внутри них.

Также обратите внимание, что, хотя в этом примере он выиграл ' t вызывает проблему, fgets сохраняет символ новой строки, '\n' в буферах; gets() нет. Если вы сравнили вход пользователя с fgets() с строковым литералом, например "abc", он никогда не будет соответствовать (если буфер не был слишком мал, чтобы '\n' не вписывался в него).

РЕДАКТИРОВАТЬ: и снова победил супер быстрый Мистик.

28
ответ дан Jonathan Leffler 15 August 2018 в 15:25
поделиться
  • 1
    Я понимаю, что вы говорите, но это всего лишь учебный пример. Я не буду использовать его по какой-либо важной причине. – nmagerko 4 November 2011 в 04:30
  • 2
    @nmagerko да, я понимаю. Это всегда важно понять. – AusCBloke 4 November 2011 в 04:32
  • 3
    то же самое в java, которое может просто сравниться с адресом. – Telerik 6 September 2014 в 17:29
  • 4
    Первым аргументом fgets должен быть char*. Но stdin является FILE* – Cool Guy 11 February 2015 в 12:08
  • 5
    Написание while (strcmp(check, input)) является достаточным и считается хорошей практикой. – The Peaceful Coder 28 June 2015 в 15:53
  • 6
    узнать больше ... codificare.in/codes/c/… – chanu panwar 25 June 2016 в 09:55
  • 7
    Безопаснее использовать strncmp! Не нужно переполнение буфера! – Floam 10 November 2017 в 19:36
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s1[50],s2[50];
        printf("Enter the character of strings: ");
        gets(s1);
        printf("\nEnter different character of string to repeat: \n");
        while(strcmp(s1,s2))
        {
            printf("%s\n",s1);
            gets(s2);
        }
        return 0;
    }

Это очень простое решение, в котором вы получите свой выход, как хотите.

0
ответ дан Rupani T D 15 August 2018 в 15:25
поделиться

Вы не можете сравнивать массивы напрямую, как это

array1==array2

Вы должны сравнить их char-by-char; для этого вы можете использовать функцию и вернуть значение boolean (True: 1, False: 0). Затем вы можете использовать его в тестовом состоянии цикла while.

Попробуйте следующее:

#include <stdio.h>
int checker(char input[],char check[]);
int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    scanf("%s",input);
    printf("I will now repeat this until you type it back to me.\n");
    scanf("%s",check);

    while (!checker(input,check))
    {
        printf("%s\n", input);
        scanf("%s",check);
    }

    printf("Good bye!");

    return 0;
}

int checker(char input[],char check[])
{
    int i,result=1;
    for(i=0; input[i]!='\0' || check[i]!='\0'; i++) {
        if(input[i] != check[i]) {
            result=0;
            break;
        }
    }
    return result;
}
6
ответ дан Shubham 15 August 2018 в 15:25
поделиться
  • 1
    Не могли бы вы добавить более подробную информацию о своем решении? – abarisone 6 April 2015 в 09:48
  • 2
    я редактировал свой пост и добавил некоторые объяснения – mugetsu 6 April 2015 в 09:59
  • 3
    да это замена для функции strcmp и solition без использования string.h header @Jongware – mugetsu 6 April 2015 в 10:02
  • 4
    Это не работает. Когда checker находит '\0' в одной из строк, он не проверяет другую строку для '\0'. Функция возвращает 1 («равно»), даже если одна строка является только префиксом другой (например, "foo" и "foobar"). – lukasrozs 6 October 2017 в 14:16
  • 5
    Я использовал бы || вместо &&. – lukasrozs 6 October 2017 в 14:28

Всякий раз, когда вы пытаетесь сравнить строки, сравните их по отношению к каждому символу. Для этого вы можете использовать встроенную строковую функцию strcmp (input1, input2); и вы должны использовать заголовочный файл с именем #include<string.h>

Попробуйте этот код:

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

int main() 
{ 
    char s[]="STACKOVERFLOW";
    char s1[200];
    printf("Enter the string to be checked\n");//enter the input string
    scanf("%s",s1);
    if(strcmp(s,s1)==0)//compare both the strings  
    {
        printf("Both the Strings match\n"); 
    } 
    else
    {
        printf("Entered String does not match\n");  
    } 
    system("pause");  
} 
1
ответ дан StephenTG 15 August 2018 в 15:25
поделиться

К сожалению, вы не можете использовать strcmp из <cstring>, потому что это заголовок C ++, и вы специально сказали, что он предназначен для приложения C. У меня была та же проблема, поэтому мне пришлось написать свою собственную функцию, которая реализует strcmp:

int strcmp(char input[], char check[])
{
    for (int i = 0;; i++)
    {
        if (input[i] == '\0' && check[i] == '\0')
        {
            break;
        }
        else if (input[i] == '\0' && check[i] != '\0')
        {
            return 1;
        }
        else if (input[i] != '\0' && check[i] == '\0')
        {
            return -1;
        }
        else if (input[i] > check[i])
        {
            return 1;
        }
        else if (input[i] < check[i])
        {
            return -1;
        }
        else
        {
            // characters are the same - continue and check next
        }
    }
    return 0;
}

Надеюсь, это вам хорошо.

0
ответ дан Steztric 15 August 2018 в 15:25
поделиться
  • 1
    Это <string.h> в C. Нет необходимости переопределять его. – mk12 31 October 2015 в 17:52
  • 2
    Ой ну спасибо. Наверное, я просто использую это вместо этого. Во всяком случае, вот пример того, как сравнивать массивы ... :) – Steztric 4 November 2015 в 11:18
  • 3
    Было бы хорошо отредактировать ваш ответ, чтобы отразить информацию в комментариях; а также вызывать вашу функцию чем-то другим (повторное использование имен из стандартной библиотеки вызывает неопределенное поведение) – M.M 11 November 2015 в 01:38
Другие вопросы по тегам:

Похожие вопросы: