我正在制作一个程序来改变用户的一个词或多个单词(最多100个字符)。例如,如果用户输入dakka dakka,他们就会打印出@ kk @ d @ kk @。我做错了什么,它只打印我输入的第一个字。
#include <stdio.h>
#include <string.h>
int main()
{
char utext[100];
int i, len;
char c;
len = strlen(utext);
printf("type in your message to be converted: \n");
fgets( utext, 100, stdin );
for ( i = 0; i < len; ++i )
{
c = utext[i];
if (c == 'a')
c = '@';
printf("%c", c);
}
return 0;
}
答案 0 :(得分:1)
您正在未经初始化的数组上调用strlen()
。
strlen()
功能会在您致电'\0'
之前搜索不在utext
的终止fgets()
。
此外,您不想迭代100个字符,如果您使用strlen()
更改sizeof()
,这将会完成,因为这将为您提供数组的大小(以字节为单位) ,原因
fgets(utext, sizeof(utext), stdin);
没关系,不仅好,它更好,因为现在你可以改变数组的大小,而无需改变这一行。
对于for
循环,我建议使用两个事实
fgets()
读取按下 Enter 时用户插入的尾随'\n'
,几乎是强制性的。
任何有效的c字符串,即在传递给strlen()
时会返回它的长度的字符串,必须有一个终止'\0'
,所以如果'\n'
不是由于某种原因出现,然后是'\0'
。
从上述两点来看,for
循环应该看起来像
for (i = 0 ; ((utext[i] != '\n') && (utext[i] != '\0')) ; ++i)
{
c = utext[i];
if (c == 'a')
c = '@';
printf("%c", c);
}
答案 1 :(得分:1)
您可以考虑通过字符阅读,然后您甚至不必存储字符串。像这样的代码可以工作:
int c;
while((c = getchar()) != EOF)
{
if(c == 'a')
printf("@");
else
printf("%c", c);
}