Hoje continuo aprendendo a estrutura de loop
EOF
#include <stdio.h>
int main()
{
int ch = 0;
// EOF - end of file 文件结束标志
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
Quando o programa está em execução, a entrada direta de EOF não pode finalizar o programa. EOF-final de arquivo é a marca de final de arquivo. Digitar Ctrl + z na janela de execução do programa exibirá a palavra ^ Z, que é a entrada de valor de código da marca de final de programa
getchar
#include <stdio.h>
int main()
{
int ch = 0;
int ret = 0;
char password[16] = { 0 };
printf("请输入密码:>\n");
scanf("%s", password); // 输入了密码 并存放在password数组中
// 缓冲区还剩余一个 '\n',
//于是读取一个 '\n';
while ((ch = getchar()) != '\n')
{
;
}
//getchar(); //读取了输入密码之后的用于确认字符串的回车
//当密码中输入空格的时候 scanf只会读取空格前内容 所以需要用getchar把空格后的字符读完
//才能在下一步进行确认
printf("请确认:> Y/N\n"); //此时输入密码后的回车会被getchar获取 字符\n的码值为10 为真
ret = getchar(); //
if (ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}
A única linha comentada "// getchar (); // Depois de ler a senha de entrada, o retorno de carro usado para confirmar a string" é usado para confirmar o último dígito do número inserido na função scanf. O caractere de retorno de carro "\ n" é removido e o valor de retorno de "\ n" é 0. Se este caractere não for removido, o seguinte se a sentença condicional não puder ser executada corretamente. Posteriormente, considerando que pode haver espaços após a entrada, e os caracteres após os espaços não podem ser obtidos por scanf, um loop while é usado para limpar os caracteres após os caracteres que podem ser removidos por scanf, e então a seguinte instrução if pode ser executada corretamente.
Consequências da omissão de declarações de valor inicial na função for
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for ( ; i < 10 ; i++)
{
for ( ; j < 10; j++)
{
printf("hehe ");
}
//内部循环省略赋初值之后会导致第一次循环完成之后变量不再进行赋初值
//下一次进入循环的时候 j==10 无法再次循环
}
return 0;
}
Originalmente, eu queria escrever um programa que pudesse produzir cem "hehe", mas como o valor inicial no loop interno é omitido, apenas dez "hehe" podem ser finalmente escritos.
Alienação de loop for
#include <stdio.h>
int main()
{
int x,y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf ("hehe ");
}
return 0;
}
O uso da declaração for também pode ser composto de várias atribuições iniciais e sentenças de julgamento
fatorial
Calcule 1! + 2! + 3! + ... + 10!
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = ret + sum;
}//1 + 2 + 6 == 9 n=3 时打印出结果为15
printf("%d \n ", sum);
return 0;
}
O acima é problemático, porque o 10 direto! O fatorial de é relativamente grande e difícil de confirmar, então os primeiros três dígitos são usados para confirmação.O resultado do programa acima é 15, 1! + 2! + 3! = = 9, obviamente há um problema. Após a depuração passo a passo, o problema foi encontrado. O código-fonte corrigido é o seguinte:
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = ret + sum;
ret = 1; //ret 运算过后保留了值 要重置才能正确加入下一次阶乘运算
}
printf("%d \n ", sum);
return 0;
}
O problema também é muito claro. O valor fatorial inicial ret = 1 no processo, mas não é zerado para 1 durante o processo, então o resultado correto não pode ser obtido. Claro, o código ainda pode ser melhorado, da seguinte forma:
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret = ret * n;
sum = sum + ret; // 直接进行累乘 时最简单的算法 只需要进行一次循环
printf(" ret=%d sum=%d\n", ret, sum);
}
return 0;
}
No código acima, a mudança do processo também é impressa, o que é conveniente para observação, e apenas um único loop é usado
Encontre um certo x de uma matriz sequencial
Matriz de sequência, refere-se a um [0] <= a [1] <= a [2] ...
#include <stdio.h>
int main()
{
int i = 0;
int v[100] = { 0 };
for (i = 0; i < 100; i++)
{
v[i] = 2 * i + 1;
}
int k = 0;
printf("请输入你想要寻找到的数字:\n");
scanf("%d", &k);
int sz = sizeof v / sizeof v[0];
for (i = 0; i < sz; i++)
{
if (k ^ v[i])
continue;
else
{
printf("找到了 v[%d]=%d \n", i, v[i]);
break;
}
}
if (i == sz)
{
printf("找不到!!!");
}
return 0;
}
Eu primeiro preenchi um array v [100] com 100 elementos em um loop e, em seguida, usei XOR para julgar, usando uma instrução if, onde o valor de retorno de "k ^ v [i]" é zero, insira else e encontre o correspondente Numere, pare o loop, o valor de retorno de "k ^ v [i]" não é zero, pule este loop.
Escreva uma string que apareça gradualmente de ambos os lados para o meio
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "Li yan qing LOVE Xie yu qing ";
char arr2[] = "*****************************";
int right = strlen(arr1) - 1;
int left = 0;
while(right >= left)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf(" %s \n", arr2);
//休息一秒,需要调用Windows.h头文件
Sleep(1000);
system("cls");//执行系统命令的函数 清空屏幕 需要调用stdlib.h头文字
left++;
right--;
}
printf(" %s \n", arr2);
return 0;
}
O efeito do código em execução é que uma linha de caracteres é gradualmente substituída por outra string de caracteres, (estou carregando bens particulares e confesso para minha namorada, [doge]). A função de strlen é encontrar o comprimento da string, que requer stdlib.h Arquivo principal. Sleep é uma função para pausar o programa. O número entre parênteses é milissegundos e o arquivo de cabeçalho necessário é windows.h. system ("cls"); // A função de executar comandos do sistema para limpar a tela precisa chamar o texto do cabeçalho stdlib.h. Deve-se notar que quando uma seqüência de caracteres é substituída por outra seqüência de caracteres, o subscrito, o último caractere da seqüência de caracteres é o caractere final '\ 0', que não será exibido após a seqüência de caracteres, mas também ocupará uma posição. Portanto, -1 é necessário ao calcular o comprimento da string;
Programas que serão encerrados após três entradas de senha incorretas
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
printf("请输入密码:\n");
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
scanf("%s", password);
if (strcmp(password, "100086") == 0)
{
printf("登录成功\a\n");
break;
}
printf("输入错误!!!\a\n");
}
if (i == 3)
{
printf("三次机会已用完,程序退出!!!\a \n");
}
return 0;
}
Entre eles, '\ a' é o som do prompt. Um ponto que vale a pena notar neste programa é que se as strings são iguais não grava diretamente as strings em ambos os lados de == para julgamento. Uma função é necessária, a função strcmp, e o arquivo de cabeçalho é string. h. A senha a ser verificada é determinada pelo redator do código-fonte, e uma porta de login mais completa pode ser projetada no futuro