//理解 atoi 的作用,并使用递归函数实现 atoi #include <stdio.h> // int atoi (char *p) // { // int num = 0,sign = 1; // while (*p != '\0') // { // if (*p == '-') // { // sign = -1; // p++; // } // if (*p == ' ') // { // p++; // continue; // } // if (*p >= '0' && *p <= '9') // { // num = num*10 + *p -'0'; // } // else // return sign*num; // p++; // } // return sign * num; // } int atoi (char *p) { if (*p == '\0') { return 0; } if (*p == '-') { return -1*atoi(p+1); } if (*p >= '0' && *p <= '9') { return (((*p - '0') *10) + atoi(p+1)); } return atoi(p+1); } int main () { char *a = "-123"; int num = atoi(a); printf ("%d\n",num); }
时间: 2024-04-16 12:25:35 浏览: 23
atoi函数的作用是将字符串转换为整数。它会跳过字符串开头的空格符,然后检查是否有一个可选的正负号,最后将连续的数字字符转换为整数。如果遇到非数字字符,则停止转换并返回已经转换的整数。
在给出的代码中,使用递归函数实现了atoi函数。递归函数首先检查字符串是否为空,如果为空,则返回0。然后检查字符串开头是否为负号,如果是,则递归调用函数处理剩余的字符串,并返回负数。接下来,如果开头是数字字符,则将其转换为整数,并乘以10,然后递归调用函数处理剩余的字符串,并将结果相加。最后,如果开头是非数字字符,则递归调用函数处理剩余的字符串。
在主函数中,将一个字符串"-123"传递给atoi函数,并将结果打印出来。预期输出为-123。
相关问题
#include <stdio.h> #include <string.h> int rvs(int num); int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); if (rvs(num)) printf("%d是回文数字\n", num); else printf("%d不是回文数字\n", num); return 0; } int rvs(int num) { char str[20]; sprintf(str, "%d", num); int len = strlen(str); if (len <= 1) return 1; else if (str[0] == str[len - 1]) return rvs(atoi(str + 1), len - 2); else return 0; }
这是一个判断一个整数是否为回文数字的程序,使用了递归的方法。函数 `rvs` 的作用是将整数转换为字符串,然后判断字符串的首尾字符是否相等,如果相等则递归调用 `rvs` 函数处理去除首尾字符的子字符串,直到字符串长度小于等于 1。如果串首尾字符不相等,则返回 0。如果最终字符串长度小于等于 1,说明整个数字是回文数字,返回 1。
在Ubuntu 22.04.2 LTS系统下使用C语言编写一个程序用于访问操作系统中某个目录下的所有文件,递归打印出所有文件的名称、类型(目录、普通文件、链接文件等)、文件大小,程序运行以传递运行命令参数的形式去设置需要遍历的目录,需要用到<unistd.h>中的getopt函数,如“./test -d /home/monalisa/os/exp6”,能够按照文件大小进行分类展示,比如按照小于10KB为一组显示、10KB~100KB为一组显示等大小分类展示。
好的,这是一个很好的问题,让我来为您解答。
首先,您需要使用C语言的系统调用来访问操作系统中的目录和文件,这些系统调用包括 opendir()、readdir() 和 closedir()。具体来说,您需要使用 opendir() 函数打开目录,并使用 readdir() 函数读取目录中的所有文件和子目录。对于每个文件,您需要使用 stat() 函数获取其文件类型和大小信息。最后,您需要使用 closedir() 函数关闭目录。
其次,您需要使用C语言中的 getopt 函数来处理命令行参数,获取需要遍历的目录路径和按照文件大小进行分类的阈值。
以下是一个示例代码,可以实现您的要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
void list_files(char *path, int min_size, int max_size) {
DIR *dir;
struct dirent *entry;
struct stat statbuf;
if ((dir = opendir(path)) == NULL) {
perror("opendir");
exit(EXIT_FAILURE);
}
while ((entry = readdir(dir)) != NULL) {
char file_path[1024];
sprintf(file_path, "%s/%s", path, entry->d_name);
if (lstat(file_path, &statbuf) == -1) {
perror("lstat");
continue;
}
if (S_ISDIR(statbuf.st_mode)) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
list_files(file_path, min_size, max_size);
}
else if (S_ISREG(statbuf.st_mode)) {
if (statbuf.st_size < min_size || statbuf.st_size > max_size) {
continue;
}
printf("%s (%s) %ld bytes\n", file_path, "regular file", statbuf.st_size);
}
else if (S_ISLNK(statbuf.st_mode)) {
printf("%s (%s) %ld bytes\n", file_path, "symbolic link", statbuf.st_size);
}
else {
printf("%s (%s)\n", file_path, "other type");
}
}
closedir(dir);
}
int main(int argc, char *argv[]) {
int opt;
char *path;
int min_size = 0;
int max_size = -1;
while ((opt = getopt(argc, argv, "d:")) != -1) {
switch (opt) {
case 'd':
path = optarg;
break;
default:
fprintf(stderr, "Usage: %s -d <path> <min_size> <max_size>\n", argv[0]);
exit(EXIT_FAILURE);
}
}
if (optind < argc) {
min_size = atoi(argv[optind++]);
}
if (optind < argc) {
max_size = atoi(argv[optind++]);
}
list_files(path, min_size, max_size);
return 0;
}
```
您可以将此代码保存为一个名为 "list_files.c" 的文件,并使用以下命令编译它:
```
gcc -o list_files list_files.c
```
然后,您可以使用以下命令运行它:
```
./list_files -d /path/to/directory min_size max_size
```
其中,"/path/to/directory" 是您要遍历的目录路径,"min_size" 和 "max_size" 是您要按照文件大小进行分类的阈值。例如,如果您要按照小于10KB为一组显示,10KB~100KB为一组显示,大于100KB为一组显示,可以使用以下命令:
```
./list_files -d /path/to/directory 0 10240
./list_files -d /path/to/directory 10240 102400
./list_files -d /path/to/directory 102400 -1
```
这样,程序就会递归遍历目录下的所有文件和子目录,并打印出所有文件的名称、类型和大小信息,按照文件大小进行分类展示。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)