在下面的程序中,我想加密一个句子。然而,当空间到来时它会提供不完整的输出。任何帮助都非常有用。
#include<stdio.h>
#include<string.h>
main()
{
printf("Enter a string : ");
char c[100];
scanf("%s",c);
int i;
for(i=0;i<100;i++)
{
if((c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
{
c[i]+=13;
if(!(c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
c[i]-=26;
}
}
printf("Encrypted string is : %s\n",c);
}
提前致谢
答案 0 :(得分:5)
scanf
停止在空白区域阅读,更改为fgets
:
fgets(c, sizeof c, stdin);
您可以使用以下方式跳过尾随换行符:
char c[100], *p;
fgets(c, sizeof c, stdin);
if ((p = strchr(c, '\n')) != NULL) {
*p = '\0'; /* remove newline */
}
另外,请考虑使用
if (isalpha((unsigned char)c[i]))
而不是
if((c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
不要忘记包含<ctype.h>
答案 1 :(得分:0)
如果您想扫描空格,则表示不要使用%s
格式说明符。使用%[^\n]
格式说明符,它将扫描除新行(\n
)之外的所有内容。
scanf("%[^\n]",c); // Fix 1
如果您使用scanf
扫描用户输入,则无需在结尾添加NULL
。它会自动添加。
在循环中无需像这样检查整个数组(最多100个字符)for(i=0;i<100;i++)
,如果输入为4或5个字符意味着不必要的话它会检查剩余位置,这样它会给你一些垃圾值。因此,限制循环以检查用户输入 -
for(i=0;c[i];i++) or for(i=0;c[i] != '\0';i++) //Fix 2
这两个都一样。当找到空字符时,它将终止循环。
试试这段代码 -
#include<stdio.h>
#include<string.h>
int main()
{
int i;
char c[100];
printf("Enter a string : ");
scanf("%[^\n]",c);
for(i=0;c[i];i++)
{
if((c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
{
c[i]+=13;
if(!(c[i]>='A'&&c[i]<='Z')||(c[i]>'a'&&c[i]<'z'))
c[i]-=26;
}
}
printf("Encrypted string is : %s\n",c);
return 0;
}