#include <string.h>
#include <stdio.h>
#define bool int
#define true 1
#define false 0
static bool is_digit(char c){
return c > 47 && c < 58;
}
static bool is_all_digit(char *s){
while(s){
if(is_digit(*s++)){
continue;
}
return false;
}
return true;
}
int main(){
char *s = "123456";
int i;
printf("len = %d\n", strlen(s));
for(i = 0; i<strlen(s); ++i){
printf("%c : %s\n", *s, is_digit(*s++)? "true" : "false");
//printf("%c : %s\n", s[i], is_digit(s[i])? "true" : "false");
}
return 0;
}
我想将功能作为注释部分实现。 但是结果如下:enter image description here
以3结尾,并且4〜6消失。 我的运行环境是win10 gcc 6.3.0
答案 0 :(得分:3)
这有很多问题。
您使用错误的格式字符串printf
。 Use %zu
for a size_t
, not %d
。
您的printf
具有未定义的行为,因为您在同一表达式中具有*s
和*s++
,并且它们之间没有sequence point。
您将在循环的每次迭代中重新计算strlen(s)
,并且该值会不断下降,因为您不断增加s
。在您开始之前,我会将strlen(s)
缓存到名为n
(或类似名称)的变量中,因为n
不会改变。
我的编译器警告我除第三个错误以外的所有错误。
该程序有效:
#include <string.h>
#include <stdio.h>
#define bool int
#define true 1
#define false 0
static bool is_digit(char c){
return c > 47 && c < 58;
}
int main(){
const char *s = "123456";
size_t i;
const size_t n = strlen(s);
printf("len = %zu\n", n);
for(i = 0; i<n; ++i){
printf("%c : %s\n", *s, is_digit(*s)? "true" : "false");
s++;
}
return 0;
}
您也可以完全跳过strlen
,而只是寻找一个空终止符:
#include <string.h>
#include <stdio.h>
#define bool int
#define true 1
#define false 0
static bool is_digit(char c){
return c > 47 && c < 58;
}
int main(){
const char *s = "123456";
while (*s) {
printf("%c : %s\n", *s, is_digit(*s)? "true" : "false");
s++;
}
return 0;
}
答案 1 :(得分:3)
for(i = 0; i<strlen(s); ++i){
s++;
}
在此for循环中,i
在增加,但是strlen(s)
在减少。
因为operator ++
更改了指针s
; (s++
)
首先,s
表示整个字符串“ 123456”;
但是在循环之后,指针s
作为一个字节移动。因此s
表示“ 23456”。
因此,strlen(s)
现在返回5。
打印“ 3”后,strlen(s)
返回3。i
也是3。
这样for循环就结束了。
表达式*s++
仅表示*“增加并取消引用”(编辑:“增加并取消引用”。)
这将有所帮助:https://en.cppreference.com/w/cpp/language/operator_precedence
感谢阅读。