我正在尝试将这一小段代码添加并打印出char指针中的所有小写字母。它打印出ab并说计数是两个,但它确实打印出来了吗?我希望它将a,b,d和f添加到名为temp的数组中。我在互联网上查了很多信息,但没有运气。感谢您的帮助。
main(){
char *str = malloc(sizeof(char)*10);
char temp[200];
int count = 0;
if(str == NULL){
printf("Error");
}
str[0] = 'a';
str[1] = 'b';
str[2] = 'C';
str[3] = 'd';
str[2] = 'E';
str[3] = 'f';
str[4] = '\0';
int res;
while(1){
res = sscanf(str, "%[a-z]%n",&temp, &count);
if(res != 1){
break;
}
printf("%s\n", temp);
printf("%d\n", count);
str = str + count;
}
printf("%s", temp);
return 0;
}
答案 0 :(得分:1)
int main(){
char *str = malloc(sizeof(char)*10);
char temp[200];
int count = 0;
if(str == NULL){
printf("Error");
}
str[0] = 'a';
str[1] = 'b';
str[2] = 'C';
str[3] = 'd';
str[4] = 'E';//index!!
str[5] = 'f';
str[6] = '\0';
int res;
char *p = str;//You do not change the str directly
while(1){
res = sscanf(p, "%[a-z]%n", temp, &count);
if(res == EOF){
break;
} else if(res == 0){
++p;
continue;
}
printf("%s\n", temp);
printf("%d\n", count);
p += count;
}
//printf("%s", temp);
free(str);
return 0;
}
答案 1 :(得分:1)
首先,你的数组元素纠缠在一起:
str[0] = 'a';
str[1] = 'b';
str[2] = 'C';
str[3] = 'd';
str[2] = 'E';
str[3] = 'f';
str[4] = '\0';
我把它从0改为6。
其次,检查编译器的警告。你应该得到这两个:
warning: return type defaults to ‘int’ [enabled by default]
warning: format ‘%[a-z’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[200]’ [-Wformat]
问题在于您正在传递&temp
。
然后您应该明白temp
将在每个循环中被覆盖,因此您需要另一个数组来收集每个循环的temp
。
然后,当res
不是一个时,这意味着您找到了至少一个大写字母,从而推进str
指针和continue
,不要{{1 }}
何时到break
?当break
的长度为零时。
总而言之,你得到了这个:
str
输出:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char *str = malloc(sizeof(char) * 10);
char temp[200];
char result[200] = "\0";
int count = 0;
if (str == NULL) {
printf("Error");
}
str[0] = 'a';
str[1] = 'b';
str[2] = 'C';
str[3] = 'd';
str[4] = 'E';
str[5] = 'f';
str[6] = '\0';
int res;
while (1) {
if(!strlen(str))
break;
res = sscanf(str, "%[a-z]%n", temp, &count);
if (res != 1) {
str = str + 1;
continue;
}
printf("temp = %s\n", temp);
printf("count = %d\n", count);
str = str + count;
strcat(result, temp);
}
printf("%s", result);
free(str);
return 0;
}
答案 2 :(得分:0)
你不能这样做:你要求scanf
将所有小写都变成temp。第一次通过时,它有abEf
(*),它得到ab
。但是在第二次传球时,它只有“Ef”并且它无法读取任何东西,所以它返回0。
不确定你想要那个,但你覆盖了str [2-3] ......
恕我直言,浏览初始字符串会更容易,并将小写字符复制到另一个字符串......
如果你真的想使用scanf,你必须在每次阅读后跳过一个字符(成功与否),并在字符串用尽时停止