Я пытаюсь изменить значение одной строки, используя другую.

#include <stdio.h>
#include <string.h>
int main(void) {
char ch[10],s[3];
int c;
fgets(ch,10,stdin);
fgets(s,2,stdin);
c=(int)s[1];
ch[3]+=c;//s[1];
printf("%c\n",s[1]);
printf("%s",ch);

    return 0;
}

Вывод пустой для s [1], а ch остается без изменений. Однако программа работает нормально, если я удалю второй get и использую константу вместо c. Я хотел бы знать мою ошибку, а также лучший простой подход к манипуляции со строками.

РЕДАКТИРОВАТЬ: изменил s [2] на s [3], все тот же результат

0
rogue_leader 25 Фев 2016 в 19:16

2 ответа

Лучший ответ

Если второй fgets() что-то прочитал (1 символ), завершающий нулевой символ будет записан в s[1].

Все биты в завершающем нулевом символе равны нулю, и это означает, что значение s[1] станет 0.

Добавление нуля почти ничего не значит.

0
MikeCAT 25 Фев 2016 в 16:23

Вы столкнулись с целым рядом проблем. Во-первых, если вы читаете fgets(s,2,stdin);, вы получаете максимум 1 символа в s плюс символ завершающий нуль . Если вы затем возьмете c=(int)s[1];, вы читаете второй символ s в c. Второй символ s будет всегда либо '\n' (0xa шестнадцатеричным, 10 десятичным), если введен 1 символ, либо {{X10} } (символ завершающий символ ).

Вы столкнетесь со следующей проблемой с ch[3]+=c;. Результат должен попадать в печатаемый диапазон символов. (см .: asciitable.com ). Это означает, что если ch содержит AAAA, первый символ s должен иметь значение ASCII 61 или меньше, чтобы оставаться в диапазоне печатаемых символов.

Возьмем следующий пример:

#include <stdio.h>

int main (void) {

    char ch[10] = "",
          s[3]  = "";
    int c = 0;

    printf (" first input : ");
    fgets (ch, 10, stdin);
    printf (" second input: ");
    fgets (s, 3, stdin);
    printf ("\n you entered:\n first : %s second: %s\n", ch, s);

    c = s[0];
    ch[3] += c;

    printf(" s[1] : %c\n",s[0]);
    printf(" ch   : %s\n",ch);

    return 0;
}

Пример использования

$ /bin/fgetsbasic
 first input : HAHA
 second input: !

 you entered:
 first : HAHA
 second: !

 s[1] : !
 ch   : HAHb

Все, что имеет значение ASCII больше, чем 61, заставит вас заполнить четвертый символ ch непечатаемым значением. (это меняется в зависимости от исходного 4-го символа в ch)

0
David C. Rankin 25 Фев 2016 в 18:15