字符串修改使用get输入

时间:2016-02-25 16:16:08

标签: c gets

我正在尝试使用其他字符串修改一个字符串的值。

#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保持不变。但是,如果我删除第二个获取并使用常量代替c,程序工作正常。 我想知道我的错误以及字符串操作的最简单方法。

编辑:将s [2]更改为s [3],结果仍然相同

2 个答案:

答案 0 :(得分:0)

如果第二个fgets()读取内容(1个字符),则终止空字符将写入s[1]

终止空字符的位均为零,这意味着s[1]的值将变为0

添加零意味着几乎没有。

答案 1 :(得分:0)

您遇到了一系列问题。第一种情况是,如果您正在阅读fgets(s,2,stdin);,则1中的s个字符加上 nul-terminatedating 字符。如果您接着c=(int)s[1];,则会将s的第二个字符读入c。如果输入1个字符或{{1},则s的第二个字符始终'\n'0xa十六进制,10十进制“ ( nul-terminatedating char)。

您使用0遇到了下一个问题。其结果必须在可打印的字符范围内。 (见:asciitable.com)。这意味着如果ch[3]+=c;包含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;
}

任何ASCII值大于$ /bin/fgetsbasic first input : HAHA second input: ! you entered: first : HAHA second: ! s[1] : ! ch : HAHb 的内容都会导致您使用不可打印的值填充61的第4个字符。 (这取决于ch中最初的第4个字符是什么)