程序不接受第二个字符串并直接给出输出
Program is not accepting second string and giving output directly
这里我想比较case2
中的两个字符串。 case 1
效果很好,但是当我转到 case 2
时,它不要求输入第二个字符串并直接打印“两个字符串都不同”[1]
[1]: https://i.stack.imgur.com/l2J6L.jpg
#include <stdio.h>
#include <stdlib.h>
#define size 20
int main ()
{
char str1[size],str2[size];
int operation,error=0,i=0;
printf("Enter String: ");
fgets(str1, size, stdin);
do {
printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
scanf("%d",&operation);
switch (operation) {
case 1:
for (int i=0; str1[i] != '[=10=]'; i++) {
str2[i] = str1[i];
}
printf("First string: %s\n",str1);
printf("Second string: %s\n",str2);
break;
default:
printf("Error");
break;
case 2:
printf("Enter second string: "); // it's not executing (Not takin input) and directly i get o/p of line 39
fgets(str2, size, stdin);
for (i=0; str2[i] != '[=10=]'; i++) {
if (str1[i] != str2[i]) {
error++;
}
}
if (error == 0) {
printf("Both strings are same.\n");
}
else
printf("Both strings are not same.\n");
break;
}
} while (operation != 3);
}
由于 scanf
留下悬垂的换行符 \n
导致 fgets 不等待用户的输入。尝试使用 getchar
.
刷新输入缓冲区
更新: 添加了循环以删除所有被 scanf
跳过但可以由用户输入的字符,例如数字后的额外空格。
...
do {
printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
scanf("%d",&operation);
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
switch (operation) {
...
因为你的字符串是行,scanf() 不是一个好的选择,除了获取整数值,然后清除缓冲区中的所有内容(可能是各种垃圾,永远不要相信用户),做a fgets 进入 str2。如果新行相同,它们也会进行比较。您还应该测试 scanf 中的 return 是否为 1,说明您得到了一个数字!如果用户输入 'x' 作为数字怎么办?如果你想再次询问,你需要清除缓冲区中的垃圾。请记住,由于您有 'cooked' 输入,因此在用户按下回车之前不会发送任何内容,因此您始终需要处理换行符。如果你所做的只是扫描数字,scanf 将通过一个新行作为白色 space 寻找数字,但你正在混合输入字符串和数字。
如果一个字符串是另一个字符串的前缀,则需要将 null 与 mis-compare 进行比较,因此在 'for' 中测试 'i < size' 但如果两个字符串都有在同一点 ( !str1[i] && !str2[i] ) 或第一次错误比较(设置错误)时为空。与第一个小姐相比没有意义!在前缀的情况下,空值 mis-compare 是其他一些字符值。
由于尾随的 space 是字符串的一部分,您可以用单引号打印它们(在删除新行之后)。
这里我想比较case2
中的两个字符串。 case 1
效果很好,但是当我转到 case 2
时,它不要求输入第二个字符串并直接打印“两个字符串都不同”[1]
[1]: https://i.stack.imgur.com/l2J6L.jpg
#include <stdio.h>
#include <stdlib.h>
#define size 20
int main ()
{
char str1[size],str2[size];
int operation,error=0,i=0;
printf("Enter String: ");
fgets(str1, size, stdin);
do {
printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
scanf("%d",&operation);
switch (operation) {
case 1:
for (int i=0; str1[i] != '[=10=]'; i++) {
str2[i] = str1[i];
}
printf("First string: %s\n",str1);
printf("Second string: %s\n",str2);
break;
default:
printf("Error");
break;
case 2:
printf("Enter second string: "); // it's not executing (Not takin input) and directly i get o/p of line 39
fgets(str2, size, stdin);
for (i=0; str2[i] != '[=10=]'; i++) {
if (str1[i] != str2[i]) {
error++;
}
}
if (error == 0) {
printf("Both strings are same.\n");
}
else
printf("Both strings are not same.\n");
break;
}
} while (operation != 3);
}
由于 scanf
留下悬垂的换行符 \n
导致 fgets 不等待用户的输入。尝试使用 getchar
.
更新: 添加了循环以删除所有被 scanf
跳过但可以由用户输入的字符,例如数字后的额外空格。
...
do {
printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
scanf("%d",&operation);
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
switch (operation) {
...
因为你的字符串是行,scanf() 不是一个好的选择,除了获取整数值,然后清除缓冲区中的所有内容(可能是各种垃圾,永远不要相信用户),做a fgets 进入 str2。如果新行相同,它们也会进行比较。您还应该测试 scanf 中的 return 是否为 1,说明您得到了一个数字!如果用户输入 'x' 作为数字怎么办?如果你想再次询问,你需要清除缓冲区中的垃圾。请记住,由于您有 'cooked' 输入,因此在用户按下回车之前不会发送任何内容,因此您始终需要处理换行符。如果你所做的只是扫描数字,scanf 将通过一个新行作为白色 space 寻找数字,但你正在混合输入字符串和数字。
如果一个字符串是另一个字符串的前缀,则需要将 null 与 mis-compare 进行比较,因此在 'for' 中测试 'i < size' 但如果两个字符串都有在同一点 ( !str1[i] && !str2[i] ) 或第一次错误比较(设置错误)时为空。与第一个小姐相比没有意义!在前缀的情况下,空值 mis-compare 是其他一些字符值。
由于尾随的 space 是字符串的一部分,您可以用单引号打印它们(在删除新行之后)。