符号的计数器

时间:2014-12-21 09:10:23

标签: c

为什么我的符号计数器错了?

我有一个功能,其中student_list[i] = "4273 Константинопольский А. А. 4333 знзнз"wchar_t test[15] = "знзнз",但counter_debt等于0.

void debt() {
  char name[100];
  wchar_t test[15];
  wchar_t * pch;
  int group;
  int exam;
  int counter_debt;
  int i;

  for (i = 0; i < 4; i++) {
    counter_debt = 0;
    sscanf(student_list[i], "%d %[^0-9] %d %S", &group, name, &exam, test);

    pch = wcschr(test, L'н');
    while (pch != NULL) {
      counter_debt++;
      pch = wcschr(pch + 1, L'н');
    }

    printf("%d %s: %d\n", group, name, counter_debt);
  }
}

当我做一个简单的函数时,counter_debt是相等的2.这是正确的答案。

#include <stdio.h>
#include <wchar.h>

int main () {
  wchar_t str[] = L"знзнз";
  wchar_t * pch;
  int count = 0;

  pch = wcschr(str, L'н');
  while (pch != NULL) {
    count++;
    pch = wcschr(pch + 1, L'н');
  }
  printf("%i", count);
  return 0;
}

UPD:

char *student_list[1000] = [
  "4272 Галкин Г. А. 5445 ззззз", 
  "4273 Константинопольский А. А. 4333 знзнз", 
  "4273 Курочкин А. А. 3433 знзнн", 
  "4272 Козлов И. И. 4443 ззззн"
]

我仍然有char *student_list的2个功能。

我使用Mac OS X 10.10.1和Apple LLVM 6.0版(clang-600.0.56)

此处有完整的计划:https://gist.github.com/lgl/4beee20f8d9a5662fef1

students.txt:https://gist.github.com/lgl/ebd21d29700284feea11

2 个答案:

答案 0 :(得分:1)

使用swscanf而不是sscanf l。是相同的功能,但它接受广泛的字符。

答案 1 :(得分:1)

这取决于使用哪种数据格式来存储student_list中的字符:

  • 如果已经wchar_t,则应使用swscanf();
  • 如果是UTF-8,在使用宽字符函数之前,您应该通过testwchar_t转换为mbstowcs()

UPD(如您的示例所示):

student_list应该有wchar_t,而不是char

要使mbstowcs()工作(此功能取决于区域设置),您需要调用:

setlocale(LC_ALL, "");