2016-02-25 62 views
0

我想修改一个字符串的值使用其他。字符串修改采取输入使用得到

#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],仍然相同的结果

+0

请格式化您的代码。 –

+0

输入是什么? –

+0

你期望输出什么? –

回答

0

如果第二fgets()读的东西(1个字符),一个终止空字符将被写入s[1]

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

加零表示几乎没有。

+0

但即使当我声明s [3]并使用s [1] ...仍然没有改变输出! –

+1

没关系。 'fgets(s,2,stdin);'将'1-char + * nul-terminator *('0')读入's','c =(int)s [1];'''c = 0'。 'ch [3] + = c;'将'0'加到'ch [3]'(所以它仍然是'ch [3]')(还记得'fgets'也读了''\ n''作为每行并包括'''',所以在没有输入的情况下按'enter'键会在's'中留下''n',0') –

0

您遇到了一系列问题。第一个如果你正在阅读fgets(s,2,stdin);,你会得到最大1字符s加上最后字符。如果你拿c=(int)s[1];你正在阅读s的第二个字符到c。的s第二字符将总是是要么'\n'0xa进制,十进制10)如果输入1个字符或0(所述NUL终止炭)。

您碰到您的下一个问题ch[3]+=c;。其结果必须属于可打印的字符范围内。 (见:asciitable.com)。这意味着如果ch包含AAAA,则s的第一个字符必须具有61或更小的ASCII值才能保留在可打印字符范围内。

看看下面的例子:

#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原来的第4个字符的变化)