如何使用sscanf查找字符串中的小写字母

时间:2014-10-31 22:41:15

标签: c pointers scanf

我正在尝试将这一小段代码添加并打印出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;    
}

3 个答案:

答案 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,你必须在每次阅读后跳过一个字符(成功与否),并在字符串用尽时停止