一行扫描 2 个字符
Scanning 2 chars in one line
我是 C 的新手,我想在一行中扫描两个 char 变量。
我使用#define _CRT_SECURE_NO_WARNINGS 因为我必须这样做。
这是一段让我烦恼的代码:scanf_s("%c-%c", &x,1, &y,1);
当输入 2 个字符时,它看起来像这样 ---> e-f 或 a-b
另外,我需要输掉 scanf_s
并将其变成 scanf
。
另一件对我来说有点奇怪的事情是,在我输入两个字符并稍后执行操作后,我将 x 和 y 的值重置为 0 并需要再次输入它们。然而,当我输入它们时,我得到了完全不同的值。
这是我到目前为止编写的全部代码。任务:输入 2 个字母并按输入中指定的顺序打印它们,例如a-c --> ABC 或 c-a --> cba
#include<stdio.h>
#define MAX 100
int main(){
char niz[MAX];
char kraj[MAX] = {0};
int razlika;//difference
char x, y;
int i;
char trenutniznak; //current character
int stoppolje=0;//stop field
int temp = 0;
while (1)
{
scanf_s("%c-%c", &x,1, &y,1);
if (x == '.' || y == '.')
{
return 0;
}
else if (y > x)//od pocetka do kraja
{ //(from start to end )
razlika = y - x + 1;
for (i = stoppolje+1, trenutniznak=x; i <= razlika; i++, trenutniznak++)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp; // polje na kojem je zadnji znak
//(the field where the last character is )
x = 0;
y = 0;
razlika = 0;
}
else
{
printf("\n");
return 0;
}
}
}
尝试理解然后在代码中实现
char c;
scanf(" %c",&c); // a whitespace character in scanf() would ignore any number of whitespace characters left in the input stream
printf("%c",c);
您可以通过 %c 转换说明符
Scanning 2 chars in one line
简化。使用 fgets()
读取 行 的用户输入并将其转换为 string.
避免scanf()
。它不能很好地读取 行 并且在输入意外时难以使用。
char buf[80];
if (fgets(buf, sizeof buf, stdin)) {
现在scan/parse把字符串变成两个字符。寻找错误的输入。
char extra;
if (sscanf(buf, "%c-%c %c", &x, &y, &extra) != 2) {
fprintf(stderr, "invalid input <%s>\n", buf);
} else {
// Use x, y in some fashion
printf("Good input <%c> <%c>\n", x, y);
}
}
潜行:如果你必须使用scanf()
,在fgets()
之前添加一个scanf("");
到使用 scanf()
。它不会读取任何内容。
"Task: input 2 letters and print them in order specified in input e.g. a-c --> ABC or c-a --> cba"
如果scanf()
不是必需的,考虑使用fgets()
,然后生成字符串数组,比如char buf[4] = {0};
数组元素buf[0]
,buf[1]
buf[2]
将包含例如 'a'
、'-'
和 'c'
。 (buf[3]
将包含 [=21=]
字符。)这些只是恰好在 ASCII 字符范围内的数值,但也可以作为数字进行逻辑操作,因此只需使用格式输出数字序列保证它们显示为 ASCII 的说明符:
int main(void)
{
char buf[4] = {0};
int c = 0;
printf("Enter maximum of three characters: eg 'a-d'\n(or ctrl-c to exit.)\n");
while(fgets(buf, sizeof buf, stdin))
{
//test input
if((buf[0] < 'a') || (buf[0] > 'Z') ||
(buf[2] < 'a') || (buf[2] > 'Z') ||
(buf[1] != '-')
)
{
printf("Invalid input. Try again\n(or hit ctrl-c to exit.");
}
else
{
buf[strcspn(buf, "\n")] = 0;//remove newline
if(buf[0] > buf[2])
{
for(char i = buf[0];i >= buf[2];i--)
{
printf("%c", i);
}
printf("\n");
}
else if ((buf[0] < buf[2]))
{
for(char i = buf[0];i<= buf[2];i++)
{
printf("%c", toupper(i));//note UPPER CASE as specified
}
printf("\n");
}
memset(buf, 0, sizeof buf);//reset buffer for next iteration.
while((c = getchar()) != '\n' && c != EOF);//clear \n from stdin
printf("\nEnter maximum of three characters: eg 'a-d'\n(or ctrl-c to exit.)\n");
}
}
}
嗯,我设法做到了,谢谢大家回答我的问题:)
#include<stdio.h>
#define MAX 1000
int main()
{
char niz[MAX];
char kraj[MAX] = {0};
int razlika;
char x, y;
int i;
char trenutniznak;
int stoppolje=-1;
int temp = 0;
while (1)
{
scanf_s(" %c-%c", &x,1, &y,1);
if (x == '.' || y == '.')
{
for (i = 0; i <= stoppolje; i++)
{
printf("%c", niz[i]);
}
return 0;
}
else if(x == '_' || y == '_')
{
niz[stoppolje + 1] = ' ';
stoppolje += 1;
}
else if (y > x)//od pocetka do kraja
{
razlika = y - x + 1;
trenutniznak = x;
for (i = stoppolje+1, trenutniznak; i < razlika+stoppolje+1; i++, trenutniznak++)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp; // polje na kojem je zadnji znak
x = 0;
y = 0;
razlika = 0;
}//ako idemo po redosljedu abecednom
else if(x>y)
{
razlika = x-y + 1;
trenutniznak = x;
for (i = stoppolje+1, trenutniznak; i < razlika + stoppolje + 1; i++, trenutniznak--)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp;
x = 0;
y = 0;
razlika = 0;
}
else if (x == y)
{
razlika = 0;
trenutniznak = x;
for (i = stoppolje + 1, trenutniznak; i < razlika + stoppolje + 2; i++, trenutniznak++)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp;
x = 0;
y = 0;
razlika = 0;
}
}
}
我是 C 的新手,我想在一行中扫描两个 char 变量。
我使用#define _CRT_SECURE_NO_WARNINGS 因为我必须这样做。
这是一段让我烦恼的代码:scanf_s("%c-%c", &x,1, &y,1);
当输入 2 个字符时,它看起来像这样 ---> e-f 或 a-b
另外,我需要输掉 scanf_s
并将其变成 scanf
。
另一件对我来说有点奇怪的事情是,在我输入两个字符并稍后执行操作后,我将 x 和 y 的值重置为 0 并需要再次输入它们。然而,当我输入它们时,我得到了完全不同的值。
这是我到目前为止编写的全部代码。任务:输入 2 个字母并按输入中指定的顺序打印它们,例如a-c --> ABC 或 c-a --> cba
#include<stdio.h>
#define MAX 100
int main(){
char niz[MAX];
char kraj[MAX] = {0};
int razlika;//difference
char x, y;
int i;
char trenutniznak; //current character
int stoppolje=0;//stop field
int temp = 0;
while (1)
{
scanf_s("%c-%c", &x,1, &y,1);
if (x == '.' || y == '.')
{
return 0;
}
else if (y > x)//od pocetka do kraja
{ //(from start to end )
razlika = y - x + 1;
for (i = stoppolje+1, trenutniznak=x; i <= razlika; i++, trenutniznak++)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp; // polje na kojem je zadnji znak
//(the field where the last character is )
x = 0;
y = 0;
razlika = 0;
}
else
{
printf("\n");
return 0;
}
}
}
尝试理解然后在代码中实现
char c;
scanf(" %c",&c); // a whitespace character in scanf() would ignore any number of whitespace characters left in the input stream
printf("%c",c);
您可以通过 %c 转换说明符
Scanning 2 chars in one line
简化。使用 fgets()
读取 行 的用户输入并将其转换为 string.
避免scanf()
。它不能很好地读取 行 并且在输入意外时难以使用。
char buf[80];
if (fgets(buf, sizeof buf, stdin)) {
现在scan/parse把字符串变成两个字符。寻找错误的输入。
char extra;
if (sscanf(buf, "%c-%c %c", &x, &y, &extra) != 2) {
fprintf(stderr, "invalid input <%s>\n", buf);
} else {
// Use x, y in some fashion
printf("Good input <%c> <%c>\n", x, y);
}
}
潜行:如果你必须使用scanf()
,在fgets()
之前添加一个scanf("");
到使用 scanf()
。它不会读取任何内容。
"Task: input 2 letters and print them in order specified in input e.g. a-c --> ABC or c-a --> cba"
如果scanf()
不是必需的,考虑使用fgets()
,然后生成字符串数组,比如char buf[4] = {0};
数组元素buf[0]
,buf[1]
buf[2]
将包含例如 'a'
、'-'
和 'c'
。 (buf[3]
将包含 [=21=]
字符。)这些只是恰好在 ASCII 字符范围内的数值,但也可以作为数字进行逻辑操作,因此只需使用格式输出数字序列保证它们显示为 ASCII 的说明符:
int main(void)
{
char buf[4] = {0};
int c = 0;
printf("Enter maximum of three characters: eg 'a-d'\n(or ctrl-c to exit.)\n");
while(fgets(buf, sizeof buf, stdin))
{
//test input
if((buf[0] < 'a') || (buf[0] > 'Z') ||
(buf[2] < 'a') || (buf[2] > 'Z') ||
(buf[1] != '-')
)
{
printf("Invalid input. Try again\n(or hit ctrl-c to exit.");
}
else
{
buf[strcspn(buf, "\n")] = 0;//remove newline
if(buf[0] > buf[2])
{
for(char i = buf[0];i >= buf[2];i--)
{
printf("%c", i);
}
printf("\n");
}
else if ((buf[0] < buf[2]))
{
for(char i = buf[0];i<= buf[2];i++)
{
printf("%c", toupper(i));//note UPPER CASE as specified
}
printf("\n");
}
memset(buf, 0, sizeof buf);//reset buffer for next iteration.
while((c = getchar()) != '\n' && c != EOF);//clear \n from stdin
printf("\nEnter maximum of three characters: eg 'a-d'\n(or ctrl-c to exit.)\n");
}
}
}
嗯,我设法做到了,谢谢大家回答我的问题:)
#include<stdio.h>
#define MAX 1000
int main()
{
char niz[MAX];
char kraj[MAX] = {0};
int razlika;
char x, y;
int i;
char trenutniznak;
int stoppolje=-1;
int temp = 0;
while (1)
{
scanf_s(" %c-%c", &x,1, &y,1);
if (x == '.' || y == '.')
{
for (i = 0; i <= stoppolje; i++)
{
printf("%c", niz[i]);
}
return 0;
}
else if(x == '_' || y == '_')
{
niz[stoppolje + 1] = ' ';
stoppolje += 1;
}
else if (y > x)//od pocetka do kraja
{
razlika = y - x + 1;
trenutniznak = x;
for (i = stoppolje+1, trenutniznak; i < razlika+stoppolje+1; i++, trenutniznak++)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp; // polje na kojem je zadnji znak
x = 0;
y = 0;
razlika = 0;
}//ako idemo po redosljedu abecednom
else if(x>y)
{
razlika = x-y + 1;
trenutniznak = x;
for (i = stoppolje+1, trenutniznak; i < razlika + stoppolje + 1; i++, trenutniznak--)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp;
x = 0;
y = 0;
razlika = 0;
}
else if (x == y)
{
razlika = 0;
trenutniznak = x;
for (i = stoppolje + 1, trenutniznak; i < razlika + stoppolje + 2; i++, trenutniznak++)
{
niz[i] = trenutniznak;
temp = i;
}
stoppolje = temp;
x = 0;
y = 0;
razlika = 0;
}
}
}