02-C. 数字判断(指针为函数参数)

该博客介绍了如何在C++中编写一个函数`isNumber`,用于判断输入的字符串是否表示一个完全的整数值。文章通过提供两种不同的实现方式展示了如何从字符串中提取整数值,并在无法转换时返回-1。示例代码包括了主函数的调用和测试用例,帮助读者理解其工作原理。

题目描述
输入一个字符串,判断这个字符串是否一个完全整数值的字符串,例如输入"1234",那么表示整数1234,输入"12a3"就表示只是一个字符串,不是一个整数

要求编写函数isNumber,参数是一个字符指针,返回值是整数类型

如果字符串表示一个整数,则计算出这个整数并且返回

如果字符串不是表示一个整数,则返回-1

主函数必须调用isNumber来判断字符串,不能使用任何C++自带或第三方的类似函数

输入
输入t表示有t个测试实例

每行输入一个字符串

依次输入t行


输出
每行输出判断结果

输入样例
3
1234
567a
0890

1234
-1
890

->return数字有两种方法
1.return stoi (a);
可以直接把数字前的0和字符串中的字母去掉
2.把字符串拆开转成数字再合并

int isNumber(char *p)//下标法
{
	int len=strlen(p),i;
	int sum=0,n=1,num=0;
	
	for(i=len;i>=0;i--) //从后往前乘
		if((p[i]-'0')>=0 && (p[i]-'0')<=9)
		{
			sum++;
			num+=(p[i]-'0')*n;
			n*=10; //n多个0
		}
	
	if(sum==len)
	return num;
    else
	return -1;
}

———————————————————————————————

#include<iostream>
using namespace std;

int isnumber(char *a)
{
    char *p=a;
    int i;
    
    for(i=0;*(p+i);i++)
        if(*(p+i)<'0'||*(p+i)>'9')
            return -1;
    
    return stoi(a);
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        char a[100];
        cin>>a;
        
        cout<<isnumber(a)<<endl;
    }
    return 0;
}
arm-none-eabi-gcc "../App/breast_led/breast_led.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xE -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I"D:/workplace/TestTool-DogHead/App/SegShow" -I"D:/workplace/TestTool-DogHead/Bsp/TM1637" -I"D:/workplace/TestTool-DogHead/Bsp/UartDrive" -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 -I"/TestTool-DogHead/App/breast_led" -I"/TestTool-DogHead/App/radar_range" -I"/TestTool-DogHead/App/servo" -I"D:/workplace/TestTool-DogHead/App/touch_head_led" -I"/TestTool-DogHead/Com" -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"App/breast_led/breast_led.d" -MT"App/breast_led/breast_led.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "App/breast_led/breast_led.o" ../Com/protocol.c: In function 'Protocol_Receive_Byte': ../Com/protocol.c:95:18: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses] 95 | if (data == FRAME_HEADER & 0x0F) arm-none-eabi-gcc "../App/SegShow/SegShow.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xE -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I"D:/workplace/TestTool-DogHead/App/SegShow" -I"D:/workplace/TestTool-DogHead/Bsp/TM1637" -I"D:/workplace/TestTool-DogHead/Bsp/UartDrive" -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 -I"/TestTool-DogHead/App/breast_led" -I"/TestTool-DogHead/App/radar_range" -I"/TestTool-DogHead/App/servo" -I"D:/workplace/TestTool-DogHead/App/touch_head_led" -I"/TestTool-DogHead/Com" -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"App/SegShow/SegShow.d" -MT"App/SegShow/SegShow.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "App/SegShow/SegShow.o" arm-none-eabi-gcc "../App/DIO/Do.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xE -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I"D:/workplace/TestTool-DogHead/App/SegShow" -I"D:/workplace/TestTool-DogHead/Bsp/TM1637" -I"D:/workplace/TestTool-DogHead/Bsp/UartDrive" -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 -I"/TestTool-DogHead/App/breast_led" -I"/TestTool-DogHead/App/radar_range" -I"/TestTool-DogHead/App/servo" -I"D:/workplace/TestTool-DogHead/App/touch_head_led" -I"/TestTool-DogHead/Com" -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"App/DIO/Do.d" -MT"App/DIO/Do.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "App/DIO/Do.o" ../App/radar_range/radar_range.c: In function 'check_sw6_button_to_display_led_seg': ../App/radar_range/radar_range.c:103:35: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 103 | APP_Display_SetString((const char *)radar_data.distance); | ^ ../App/radar_range/radar_range.c: At top level: ../App/radar_range/radar_range.c:16:16: warning: 'sw6_prev_state' defined but not used [-Wunused-variable] 16 | static uint8_t sw6_prev_state = 1; // 初始状态为高电平(未按下) | ^~~~~~~~~~~~~~ ../App/breast_led/breast_led.c: In function 'send_chest_light_command': ../App/breast_led/breast_led.c:23:55: warning: passing argument 3 of 'send_protocol_frame' makes pointer from integer without a cast [-Wint-conversion] 23 | send_protocol_frame(&huart1, cmd_chest_light, light_data, 1, 0x15); | ^~~~~~~~~~ | | | uint8_t {aka unsigned char} In file included from ../App/breast_led/breast_led.h:11, from ../App/breast_led/breast_led.c:8: ../App/breast_led/../../Com/protocol.h:62:76: note: expected 'void *' but argument is of type 'uint8_t' {aka 'unsigned char'} 62 | void send_protocol_frame(UART_HandleTypeDef *huart, uint8_t command, void *data, uint8_t data_length, uint8_t type); | ~~~~~~^~~~ arm-none-eabi-gcc -o "TestTool-DogHead.elf" @"objects.list" -mcpu=cortex-m3 -T"D:\workplace\TestTool-DogHead\STM32F103RCTX_FLASH.ld" --specs=nosys.specs -Wl,-Map="TestTool-DogHead.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group Finished building target: TestTool-DogHead.elf arm-none-eabi-size TestTool-DogHead.elf arm-none-eabi-objdump -h -S TestTool-DogHead.elf > "TestTool-DogHead.list" text data bss dec hex filename 27048 20 8540 35608 8b18 TestTool-DogHead.elf Finished building: default.size.stdout Finished building: TestTool-DogHead.list 13:45:33 Build Finished. 0 errors, 4 warnings. (took 4s.384ms)
最新发布
11-04
你提供的编译输出信息中包含了多个 **C语言编译警告(warnings)**,虽然没有错误导致构建失败,但这些警告可能隐藏潜在的逻辑或类型安全问题。下面我将逐条分析每个警告的原因,并提供相应的修复方法。 --- ### 🔹 警告 1:比较操作符优先级问题 ```c ../Com/protocol.c:95:18: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses] 95 | if (data == FRAME_HEADER & 0x0F) ``` #### ✅ 问题原因: `&` 的优先级低于 `==`,所以表达式: ```c data == FRAME_HEADER & 0x0F ``` 等价于: ```c data == (FRAME_HEADER & 0x0F) ``` 但这可能是开发者误以为是: ```c (data == FRAME_HEADER) & 0x0F ``` 虽然语法合法,但语义容易出错,因此 GCC 发出警告建议加括号明确意图。 #### 🛠️ 修复方式: 根据你的实际需求选择其一: - 如果你想判断 `data` 是否等于 `(FRAME_HEADER & 0x0F)`,应写为: ```c if (data == (FRAME_HEADER & 0x0F)) ``` - 如果你真想做布尔结果与 `0x0F` 按位与(几乎无意义),则写成: ```c if ((data == FRAME_HEADER) & 0x0F) // 不推荐,逻辑奇怪 ``` > ⚠️ 通常情况是第一种意图,即先对 `FRAME_HEADER` 掩码再比较。 ✅ 正确修改示例: ```c if (data == (FRAME_HEADER & 0x0F)) ``` --- ### 🔹 警告 2:整数转指针时大小不匹配 ```c ../App/radar_range/radar_range.c:103:35: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 103 | APP_Display_SetString((const char *)radar_data.distance); ``` #### ✅ 问题原因: 你试图把一个数值(如 `float` 或 `uint16_t` 类型的 `distance`)直接强制转换成 `const char*` 指针,这在嵌入式系统中非常危险。 例如: ```c APP_Display_SetString((const char *)radar_data.distance); ``` 假设 `radar_data.distance` 是一个浮点数或整数距离值(比如 12.5 cm),你把它当作字符串指针传入,会导致: - 程序尝试访问内存地址 `0x0000000C` 或类似位置; - 引发 HardFault、崩溃或显示乱码。 这不是“把数字变成字符串”,而是错误地将数值解释为内存地址! #### 🛠️ 正确做法: 使用缓冲区和格式化函数(如 `sprintf` 或 `snprintf`)将其转为字符串: ```c #include <stdio.h> char str_buffer[16]; snprintf(str_buffer, sizeof(str_buffer), "%.1f", radar_data.distance); APP_Display_SetString(str_buffer); ``` > 注意:确保 `APP_Display_SetString` 接收的是指向以 `\0` 结尾的字符数组,而不是野指针--- ### 🔹 警告 3:未使用的静态变量 ```c ../App/radar_range/radar_range.c:16:16: warning: 'sw6_prev_state' defined but not used [-Wunused-variable] 16 | static uint8_t sw6_prev_state = 1; // 初始状态为高电平(未按下) ``` #### ✅ 问题原因: 定义了一个静态变量 `sw6_prev_state`,但在整个文件中从未被读取或修改。 #### 🛠️ 修复方式: - 若将来会用,可暂时保留并添加注释屏蔽警告: ```c static uint8_t sw6_prev_state __attribute__((unused)) = 1; ``` - 若确定不再需要,直接删除该行。 --- ### 🔹 警告 4:整型作为指针传递给期望 `void*` 的参数 ```c ../App/breast_led/breast_led.c:23:55: warning: passing argument 3 of 'send_protocol_frame' makes pointer from integer without a cast [-Wint-conversion] 23 | send_protocol_frame(&huart1, cmd_chest_light, light_data, 1, 0x15); | ^~~~~~~~~~ In file included from ../App/breast_led/breast_led.h:11, from ../App/breast_led/breast_led.c:8: ../App/breast_led/../../Com/protocol.h:62:76: note: expected 'void *' but argument is of type 'uint8_t' 62 | void send_protocol_frame(UART_HandleTypeDef *huart, uint8_t command, void *data, uint8_t data_length, uint8_t type); ``` #### ✅ 问题原因: 函数声明要求第3个参数是 `void *data`(即指向数据的指针),但你传了一个 `uint8_t` 类型的值(不是地址)。 比如: ```c uint8_t light_data = 0x55; send_protocol_frame(&huart1, cmd_chest_light, light_data, 1, 0x15); // ❌ 错误!传值而非地址 ``` #### 🛠️ 正确修复方法: 你应该传 `light_data` 的地址: ```c uint8_t light_data = 0x55; send_protocol_frame(&huart1, cmd_chest_light, &light_data, 1, 0x15); // ✅ 正确:传地址 ``` > 因为底层函数会从 `void *data` 处复制 `data_length` 字节的数据,必须是一个有效指针--- ### ✅ 总结修复方案 | 警告 | 修复方式 | |------|---------| | `suggest parentheses around comparison` | 加括号明确优先级:`(data == (FRAME_HEADER & 0x0F))` | | `cast to pointer from integer of different size` | 不要将数值强转为字符串指针,改用 `snprintf` 格式化输出 | | `defined but not used` | 删除未使用变量或标记 `__attribute__((unused))` | | `passing integer to void* parameter` | 改传变量地址 `&light_data` 而非值本身 | --- ### 💡 示例修正代码片段汇总: ```c // protocol.c - 修复比较优先级 if (data == (FRAME_HEADER & 0x0F)) { // 处理帧头 } // radar_range.c - 数值转字符串显示 char dist_str[16]; snprintf(dist_str, sizeof(dist_str), "%.1f", radar_data.distance); APP_Display_SetString(dist_str); // radar_range.c - 移除或标记未使用变量 static uint8_t sw6_prev_state __attribute__((unused)) = 1; // breast_led.c - 传递地址而非值 uint8_t light_data = 0x55; send_protocol_frame(&huart1, cmd_chest_light, &light_data, 1, 0x15); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值