目录
str[strcspn(str, "\n")] = '\0';代码详解
反转整数的完整代码
下面是一个使用 C 语言编写的反转整数的程序,它可以读入一个整数,然后将该整数反转,并输出结果:
#include <stdio.h>
int reverse(int num) {
int rev_num = 0;
while (num != 0) {
rev_num = rev_num * 10 + num % 10;
num /= 10;
}
return rev_num;
}
int main() {
int num;
printf("Enter a number: ");
scanf("%d", &num);
int rev_num = reverse(num);
printf("Reversed number is: %d\n", rev_num);
return 0;
}
在这个程序中,我们首先定义了一个 reverse
函数,它接受一个整数作为参数,并返回反转后的整数。在函数内部,我们使用一个循环遍历该整数的每一位数字,并将它们按照相反的顺序组合成一个新的整数。具体来说,我们首先把 rev_num
初始化为 0,然后每次取出原数的最后一位数字并加入到 rev_num
中,接着将原数除以 10 并继续进行循环,直到原数变成 0 为止。
在主函数中,我们使用 scanf
函数读入一个整数,并调用 reverse
函数将其反转。最后,我们输出反转后的整数。
反转字符串的完整代码
#include <stdio.h>
#include <string.h>
void reverseString(char* str)
{
int length = strlen(str);
int start = 0;
int end = length - 1;
while (start < end)
{
// 交换首尾字符
char temp = str[start];
str[start] = str[end];
str[end] = temp;
// 移动指针
start++;
end--;
}
}
int main()
{
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
// 去除输入字符串的换行符
str[strcspn(str, "\n")] = '\0';
reverseString(str);
printf("反转后的字符串为:%s\n", str);
return 0;
}
(这里fgets函数在莫莫子的小写字母转换成大写字母的博客中详细讲过,并有具体的例子)
代码详解
在上述代码中,我们定义了一个 reverseString
函数,用于反转字符串。该函数接受一个字符串作为参数,并通过交换首尾字符来实现反转。
在主函数中,我们先从用户处获取一个输入字符串,并使用 fgets
函数来保证输入的字符串不会超出预设的长度(这里设定为 100)。
接下来,我们调用 reverseString
函数对输入的字符串进行反转操作。
最后,我们通过 printf
函数输出反转后的字符串。
请注意,上述程序假设输入的字符串长度不超过 100。如果需要处理更长的字符串,可以适当调整 str
数组的大小。
reverseString(char* str)代码详解
在 C 语言中,字符串本质上是一个字符数组,以空字符 '\0'
结尾。因此,在将字符串作为函数参数传递时,通常使用指向字符数组第一个元素的指针来表示字符串。
在函数声明中,我们可以将参数类型定义为 char*
,表示一个指向字符的指针。在函数内部,我们可以通过该指针来访问整个字符数组,并对其进行操作。
例如,在上述反转字符串的程序中,我们定义了一个 reverseString
函数,它接受一个字符串作为参数:
void reverseString(char* str) {
// ...
}
在函数内部,我们通过指针 str
来访问字符串中的每个字符:
char temp = str[start];
str[start] = str[end];
str[end] = temp;
当我们在主函数中调用该函数时,可以直接将字符串的地址传递给函数:
char str[100];
// ...
reverseString(str);
这里,str
数组名实际上是一个指向数组第一个元素的指针。因此,将 str
传递给函数时,实际上传递的就是一个指向字符数组的指针。
总之,使用指针来表示字符串是 C 语言中的惯用做法,它能够简化代码并提高程序的效率。
str[strcspn(str, "\n")] = '\0';代码详解
strcspn
函数可以用来查找字符串中第一个匹配指定字符集的字符,并返回该字符在字符串中的位置。因此,str[strcspn(str, "\n")]
表达式可以用来查找字符串 str
中第一个换行符 '\n'
的位置,并将其替换为字符串终止符 '\0'
。
为什么需要做这个替换呢?
原因是在使用 fgets
函数获取用户输入时,输入字符串中可能包含换行符(用户按下回车键)。如果不去除这个换行符,后续对字符串进行操作时就会出现问题。
总而言之,这段代码的目的是处理 fgets
函数读取字符串时带来的换行符问题,以确保后续对字符串的操作能够正确进行。
那为啥不直接把fgets替换成scanf呢?
(为啥这么问呢,请看莫莫子的小写字母转换成大写字母的博客里主要讲的就是这个)
使用 scanf
函数和 fgets
函数获取用户输入都是可以的,但是它们有各自的适用场景和注意事项。
-
fgets
函数适用于获取包含空格的字符串输入。fgets
可以一次性读取一整行输入(包括空格),并将完整的输入存储到指定的字符数组中。 -
scanf
函数也可以用来获取用户输入,但是它在处理空格时会有一些限制。具体而言,scanf
在遇到空格、制表符或换行符时会停止读取,因此无法一次性获取包含空格的完整行输入。
在反转字符串的程序中,如果要求用户输入包含空格的字符串,推荐使用 fgets
而不是 scanf
,因为 fgets
可以正确地获取包含空格的完整行输入。
总之,虽然 scanf
和 fgets
都可以用来获取用户输入,但是在处理包含空格的字符串输入时,推荐使用 fgets
。