проблемы со строками указателя c - PullRequest
0 голосов
/ 21 октября 2018

:) Я пытаюсь разбить строковые указатели в c, поэтому я пишу этот код, но я не получил ожидаемый результат.

Я создаю строковую переменную и хочупередать его в функцию, которая проверяет длину строки больше 10.

Это код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
bool is_bigger_than_10(char *);

int main()
{
    char *string1 = "";
    int i = 0;
    printf("Initial string: %s\n",&string1);
    printf("Size is: %d\n",strlen(&string1));
    printf("Give me one string: ");
    scanf("%[^\t\n]s",&string1);  //This scan allows me to enter string with spaces

    printf("You write: %s\n", &string1);
    printf("Size is: %d\n",strlen(&string1));
    printf("String character by character:\n");
    for(i = 0; i < strlen(&string1) ; i++)
    {
        printf("%c ",&string1[i]);
    }

    printf("\nNow let's check if it's bigger than 10\n");
    printf("Answer is: %d",is_bigger_than_10(&string1));

    return 0;
}

bool is_bigger_than_10(char *textx)
{
    printf("%s --> %d > %d\n",&textx, strlen(&textx),10);
    if(strlen(&textx) > 10)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Ожидаемый результат должен быть:

Initialстрока:
Размер равен 0:
Дайте мне одну строку: axel
Вы пишете: axel
Строка символ за символом:
axel
Теперь давайте проверим, больше ли оно 10
axel -> 4> 10
Ответ: 0

Если вы запустите этот код и введете axel в качестве входной строки, вы получите следующее:

Начальная строка: $ 0 @
Размер 3:
Дайте мне одну строку: axel
Вы пишете: axel
Строка символ за символом: abcde
axel
Теперь давайте проверим, больше ли оночем 10
'-> 3> 10
Ответ: 0

Это странно, может кто-нибудь помочь мне исправить этот код?

1 Ответ

0 голосов
/ 21 октября 2018

Здесь происходит две вещи:

Во-первых, указатель вашего символа должен указывать куда-то.С помощью строки

char *string1 = "";

вы создаете указатель на строковый литерал, в который вы не можете писать.(Очевидно, вы можете, учитывая ваш вывод, но вам просто повезло в системе, которая позволяет это.) Вместо этого создайте символьный буфер:

char string1[200] = "";

и в идеале применяйте постоянный предел буфера при чтении строки.

Во-вторых, вам не нужны все эти & с.& - это не магический маркер, который вы должны добавить ко всем своим аргументам.

& берет адрес переменной и передает его как указатель.Это необходимо, когда вызываемая функция должна изменить переменную с помощью указателя.Печать не должна ничего менять, поэтому, если вы не хотите печатать адрес переменной с %p, вы не должны передавать адреса.(В особом случае вашей программы вы можете просто удалить все амперсанды с помощью поиска и замены.)

При сканировании вам необходимо изменить переменные, если вы преобразуете ввод в числа или сканируете символ.Исключение составляют случаи, когда вы сканируете строки с помощью %s или %[...]: здесь вы передаете буфер символов (как указатель на его первые элементы), а затем функция заполняет этот буфер.

Проблема с scanf и printf - это то, что аргументы после строки формата являются переменными, что означает, что они будут принимать любые аргументы без проверки типа.Хорошо, что большинство компиляторов могут определить, соответствует ли строка формата аргументам, и будут выдавать предупреждения, если вы их включите.Сделай себе одолжение и сделай это.

(Предупреждения также сообщат вам, что у вас есть несоответствия типов в функциях, для которых известен тип аргумента, например, is_bigger_than_10.)

...