特点:利用fgets代替scanf来获得用户输入,避免缓冲区溢出;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void string_reverse(char* str)
{
int i = 0;
int j = strlen(str) - 1;
char temp;
while (i < j)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
}
int main(void)
{
char str[60] = { 0 };
printf("enter string like abcdef:\n");
fgets(str, sizeof(str), stdin);
//fgets函数可限制读取的字符数,避免缓冲区溢出(例如利用scanf的话,输入的字符数超过60会导致缓冲区溢出;
str[strcspn(str, "\n")] = '\0';// 移除字符串末尾的换行符(如果有的话)
string_reverse(str);
printf("reverse string is %s\n", str);
return 0;
}
1 利用fgets代替scanf来获得用户输入,避免缓冲区溢出;
fgets函数可以指定读取的长度,
下面的程序表示最多读取59个字符,和一个字符串终止符'\0',若用户输入字符数超过59,只读取前59个,超过的部分将留在缓冲区;
char str[60];
fgets(str, sizeof(str), stdin);
//这里sizeof(str)=60,表示最多读取59个字符,和一个字符串终止符'\0'
2 str[strcspn(str, "\n")] = '\0';
的作用
- 查找换行符:
strcspn(str, "\n")
返回str
中第一个换行符'\n'
的索引,如果没有找到换行符,则返回字符串长度。 - 移除换行符:
str[strcspn(str, "\n")] = '\0';
用空字符'\0'
替换换行符,将其从字符串中移除。
假设用户输入 abcdef
并按 Enter 键:
- 加上移除换行符的代码:
str
将是"abcdef"
(不含换行符)。 - 不加移除换行符的代码:
str
将是"abcdef\n"
(含换行符)。