我正在尝试使用其他字符串修改一个字符串的值。
#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)
如果第二个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个字符是什么)