C语言学习之小野这些天犯过的二
常犯的错误
避免不必要的错误是编程的基本,错的每一次都要花费大量时间来弥补。这里犯的错误一般不是因为编译器报错,而是代码未达到想要的要求,未报错的情况下,纠正错误时很麻烦,以此谨记!!!
错误一
#include <stdio.h>
int main(void)
{
int n = 5;
while (n < 7);//while()后若跟了;程序将无法按要求运行,且系统不会报错
{
printf("n = %d\n", n);
n++;
printf("Now n = %d\n", n);
}
printf("Game over!\n");
return 0;
}
订正:
#include <stdio.h>
int main(void)
{
int n = 5;
while (n < 7) // 第7行
{
printf("n = %d\n", n);
n++; // 第10行
printf("Now n = %d\n", n); // 第11行
}
printf("The loop has finished.\n");
return 0;
}
错误二
#include<stdio.h>
int is_prime(int n)
{
int j=0;
for(j=2;j<n;j++)//可以用j<=sqrt(n)优化代码
{
if(n%j==0)
return 0;//输入9等数时,由于不能被2等数除尽,容易得到错误判断
else
return 1;
}
}
int main(void)
{
int i=0;
for(i=100;i<=200;i++)
{
if(is_prime(i)==1)
printf("%d ",i);
}
return 0;
}
订正:
#include<stdio.h>
int is_prime(int n)
{
int j=0;
for(j=2;j<n;j++)//可以用j<=n优化代码
{
if(n%j==0)
return 0;//输入9等数时,由于不能被2除尽,容易得到错误判断
}
return 1;
}
int main(void)
{
int i=0;
for(i=100;i<=200;i++)
{
if(is_prime(i)==1)
printf("%d ",i);
}
return 0;
}
错误三
#include<stdio.h>
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while (scanf_s("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);//调用函数
printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)//函数定义
{
double pow = 1;
int i;
return pow;//上一段未删除干净导致一直输出1,臭小子,这都能错!!!
if (n == 0 && p == 0)
{
printf("0的0次幂无定义\n");
}
return 0;//由于没有将return 0;写入花括号内导致无论是什么,都会进入这一步,又双叒是粗心大意!!!!
if (n == 0 && p != 0)
return 0;//0的任何次幂(除了0)都等于0
if (p == 0 && n != 0)
return 1;//除0外,任何数的0次幂都等于1
if (p > 0)
{
for (i = 1; i <= p; i++)
pow *= n;
return pow;
}
else
{
for (i = 1; i <= -p; i++)
pow *= n;
}
return 1/pow;
}
订正:
#include <stdio.h>
double power(double n, int p);
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while (scanf_s("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);//调用函数
printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)//函数定义
{
double pow = 1;
int i;
if (n == 0 && p == 0)
{
printf("0的0次幂无定义\n");
return 0;//0的0次幂无定义
}
if (n == 0 && p != 0)
return 0;//0的任何次幂(除了0)都等于0
if (p == 0 && n != 0)
return 1;//除0外,任何数的0次幂都等于1
if (p > 0)
{
for (i = 1; i <= p; i++)
pow *= n;
return pow;
}
else
{
for (i = 1; i <= -p; i++)
pow *= n;
}
return 1 / pow;
}
错误四
#include<stdio.h>
int main(void)
{
double arr[4] = {1.2,1.3,2.4,2.5};
printf("这四个数据中最大值下标是%g\n", max(arr, 4));
printf("这四个数据的极差是%g\n", jicha(arr,4));
return 0;
}
double jicha(double arr[], int n)
{
double max = arr[0];
double min = arr[0];
for (int i = 0; i < n; i++)
{
if (max < arr[i]) max = arr[i];
if (min > arr[i]) min = arr[i];
}
return max - min;
}
double max(double arr[], int n)
{
double max = arr[0];
int a = 0;
int j = 0;
for (int i = 0; i < n; i++)
{
if (max < arr[i]) max = arr[i];//由于没有将“mar = arr[i];”放入花括号,所以每次进入循环都会赋值一次
{
max = arr[i];
j = i;
}
}
return j;
}
错误五
/*冒号排序*/
#include<stdio.h>
void bubble_sort(int arr[])//进行传参
{
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//由于传参时传的是地址,所以成了指针,两相同指针大小相除就得到结果1
for (i = 0; i < sz - 1; i++);//又双叒多了一个分号,进不去下一个循环
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//每一趟冒泡排序的操作
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main(void)
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//确定数组元素个数
bubble_sort(arr);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
订正:
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
int a = 0;
int j = 0;
for (a = 0; a < sz; a++)
{
for (j = 0; j < sz - 1 - a; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main(void)
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
错误示范2
错误示范3
错误六
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest);
assert(src);
while (*dest)
{
dest++;
}
while (*dest++ = *src++)//优化代码时忘记了打上";"号,导致追进一个元素
return ret;
}
int main(void)
{
char dest[80] = "Our wold ";
char src[] = "is beautiful.";
my_strcat(dest, src);
printf("%s\n", dest);
return 0;
}
订正:
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest);
assert(src);
while (*dest)
{
dest++;
}
while (*dest++ = *src++);
return ret;
}
int main(void)
{
char dest[80] = "Our wold ";
char src[] = "is beautiful.";
my_strcat(dest, src);
printf("%s\n", dest);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了