#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
unsigned long pulArray[] = { 6,7,8,9,10 };
unsigned long* pulPtr;
pulPtr = pulArray;
*(pulPtr + 3) += 3;
printf("%d,%d\n", *pulPtr, *(pulPtr + 3));//6 12
return 0;
}
输出:6,12
写一个函数,可以逆序字符串的内容:
问:printf(“%s\n”, arr);arr是给一个地址吗?
ChatAI答:
是的,arr
在这里是一个指向字符数组的指针(即字符串的首地址),使用%s
格式符时,printf函数会根据该地址开始输出字符数组中的全部字符,直到遇到空字符\0
为止。因此,这行代码会将字符串输出到终端上,并在末尾自动添加一个换行符。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strlen(char* arr)
{
int len = 0;
while (*arr != '\0')
{
arr++;
len++;
}
return len;
}
void my_reverse(char* arr)
{
assert(arr);
int len = my_strlen(arr);
char* left = arr;
char* right = arr + len - 1;
while (left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[256] = {0};
//scanf("%s", arr);//无法完整读取包含空格的字符串
gets(arr);//读取一行
my_reverse(arr);
printf("逆序后的字符串:%s\n", arr);
return 0;
}
输出:
问:
C语言,assert();括号里面传什么参数?
ChatAI答:
assert()
是C语言标准库中的一个宏定义,用于在程序中进行断言检查,如果断言失败则会触发程序异常终止,并输出一条信息说明断言失败的具体信息。
assert()
的语法格式如下:
void assert(int expression);
其中,expression
是一个用于断言检查的表达式,通常为某个条件判断表达式。如果检查表达式的结果为false,则assert()
会在stderr输出错误信息并终止程序。
因此,assert()
括号中应该传入一个需要被检查的表达式,通常是一个条件判断语句,例如:
int a,b;
// 假设a,b已经被赋值
assert(a == 0); // 如果a的值不为0,程序会停止并提示错误信息
assert(b > 10); // 如果b的值不大于10,程序会停止并提示错误信息
问:
在VS2015环境下运行上述代码会报警告,但是在老师的VS2010环境下不报警告。warning C4013: “gets”未定义;假设外部返回 int
ChatAI答:
这个警告信息是编译器给出的提示,含义是gets
函数未被定义,并且假设外部返回int
类型。
在C语言标准库中,确实包含有gets()函数,它用于从标准输入流(stdin)中读取一行字符数据,但是在C11标准中已经将gets()标记为不安全的函数(因为它可能会导致缓冲区溢出问题),并建议开发者使用fgets()函数代替它。
由于gets()函数不再被建议使用,因此在较新的编译器中可能已经被移除,所以编译器给出了“未定义”的提示。为了避免这个问题,您可以将gets()函数替换为fgets()函数,如下所示:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
printf("您输入的字符串是: %s\n", str);
return 0;
}
使用fgets()函数读取用户输入可以有效防止缓冲区溢出问题,同时避免“未定义”的警告。
输入2个数字,打印出如下信息。比如输入:2 5,则求和:2+22+222+2222+22222
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int n = 0;
scanf("%d%d", &a, &n);
int sum = 0;
int i = 0;
int ret = 0;
for (i = 0; i < n; i++)
{
ret = ret * 10 + a;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
求出0~100000之间的所有“自幂数”并输出。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
for (i = 0; i <= 100000; i++)
{
//判断i是否为自幂数
//1.计算i的位数 n位数
int n = 1;
int tmp = i;
int sum = 0;
while (tmp /= 10)
{
n++;
}
//2.计算i的每一位的n次方之和 sum
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, n);
tmp /= 10;
}
//3.比较i == sum
if (i == sum)
{
printf("%d ", i);
}
}
return 0;
}
输出:
打印菱形:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
int line = 0;
scanf("%d", &line);
//打印上半部分
int i = 0;
for (i = 0; i < line; i++)
{
//打印空格
int j = 0;
for (j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
for (i = 0; i < line-1; i++)
{
int j = 0;
//打印空格
for (j = 0; j <= i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * (line-1-i)-1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
输出: