2011/02/25

c字符串函數

c字符串函數

函數名: strchr
: 在一個串中查找給定字符的第一個匹配之處
: char *strchr(char *str, char c);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char string[15];
char *ptr, c = 'r';
strcpy(string, This is a string);
ptr = strchr(string, c);
if (ptr)
printf(The character %c is at position: %dn, c, ptr-string);
else
printf(The character was not foundn);
return 0;
}


函數名: strncmpi
: 將一個串中的一部分與另一個串比較, 不管大小寫
: int strncmpi(char *str1, char *str2, unsigned maxlen);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = BBB, *buf2 = bbb;
int ptr;
ptr = strcmpi(buf2, buf1);
if (ptr > 0)
printf(buffer 2 is greater than buffer 1n);
if (ptr < 0)
printf(buffer 2 is less than buffer 1n);
if (ptr == 0)
printf(buffer 2 equals buffer 1n);
return 0;
}




函數名: strcspn
: 在串中查找第一個給定字符集內容的段
: int strcspn(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
#include <alloc.h>
int main(void)
{
char *string1 = 1234567890;
char *string2 = 747DC8;
int length;
length = strcspn(string1, string2);
printf(Character where strings intersect is at position %dn, length);
return 0;
}



函數名: strdup
: 將串拷貝到新建的位置處
: char *strdup(char *str);
程序例:
#include <stdio.h>
#include <string.h>
#include <alloc.h>
int main(void)
{
char *dup_str, *string = abcde;
dup_str = strdup(string);
printf(%sn, dup_str);
free(dup_str);
return 0;
}



函數名: stricmp
: 以大小寫不敏感方式比較兩個串
: int stricmp(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = BBB, *buf2 = bbb;
int ptr;
ptr = stricmp(buf2, buf1);
if (ptr > 0)
printf(buffer 2 is greater than buffer 1n);
if (ptr < 0)
printf(buffer 2 is less than buffer 1n);
if (ptr == 0)
printf(buffer 2 equals buffer 1n);
return 0;
}


函數名: strerror
: 返回指向錯誤信息字符串的指針
: char *strerror(int errnum);
程序例:
#include <stdio.h>
#include <errno.h>
int main(void)
{
char *buffer;
buffer = strerror(errno);
printf(Error: %sn, buffer);
return 0;
}



函數名: strcmpi
: 將一個串與另一個比較, 不管大小寫
: int strcmpi(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = BBB, *buf2 = bbb;
int ptr;
ptr = strcmpi(buf2, buf1);
if (ptr > 0)
printf(buffer 2 is greater than buffer 1n);
if (ptr < 0)
printf(buffer 2 is less than buffer 1n);
if (ptr == 0)
printf(buffer 2 equals buffer 1n);
return 0;
}



函數名: strncmp
: 串比較
: int strncmp(char *str1, char *str2, int maxlen);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = aaabbb, *buf2 = bbbccc, *buf3 = ccc;
int ptr;
ptr = strncmp(buf2,buf1,3);
if (ptr > 0)
printf(buffer 2 is greater than buffer 1n);
else
printf(buffer 2 is less than buffer 1n);
ptr = strncmp(buf2,buf3,3);
if (ptr > 0)
printf(buffer 2 is greater than buffer 3n);
else
printf(buffer 2 is less than buffer 3n);
return(0);
}


函數名: strncmpi
: 把串中的一部分與另一串中的一部分比較, 不管大小寫
: int strncmpi(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = BBBccc, *buf2 = bbbccc;
int ptr;
ptr = strncmpi(buf2,buf1,3);
if (ptr > 0)
printf(buffer 2 is greater than buffer 1n);
if (ptr < 0)
printf(buffer 2 is less than buffer 1n);
if (ptr == 0)
printf(buffer 2 equals buffer 1n);
return 0;
}


函數名: strncpy
: 串拷貝
: char *strncpy(char *destin, char *source, int maxlen);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = abcdefghi;
strncpy(string, str1, 3);
string[3] = '';
printf(%sn, string);
return 0;
}


函數名: strnicmp
: 不注重大小寫地比較兩個串
: int strnicmp(char *str1, char *str2, unsigned maxlen);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = BBBccc, *buf2 = bbbccc;
int ptr;
ptr = strnicmp(buf2, buf1, 3);
if (ptr > 0)
printf(buffer 2 is greater than buffer 1n);
if (ptr < 0)
printf(buffer 2 is less than buffer 1n);
if (ptr == 0)
printf(buffer 2 equals buffer 1n);
return 0;
}



函數名: strnset
: 將一個串中的所有字符都設為指定字符
: char *strnset(char *str, char ch, unsigned n);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string = abcdefghijklmnopqrstuvwxyz;
char letter = 'x';
printf(string before strnset: %sn, string);
strnset(string, letter, 13);
printf(string after strnset: %sn, string);
return 0;
}


函數名: strpbrk
: 在串中查找給定字符集中的字符
: char *strpbrk(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string1 = abcdefghijklmnopqrstuvwxyz;
char *string2 = onm;
char *ptr;
ptr = strpbrk(string1, string2);
if (ptr)
printf(strpbrk found first character: %cn, *ptr);
else
printf(strpbrk didn't find character in setn);
return 0;
}



函數名: strrchr
: 在串中查找指定字符的最後一個出現
: char *strrchr(char *str, char c);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char string[15];
char *ptr, c = 'r';
strcpy(string, This is a string);
ptr = strrchr(string, c);
if (ptr)
printf(The character %c is at position: %dn, c, ptr-string);
else
printf(The character was not foundn);
return 0;
}



函數名: strrev
: 串倒轉
: char *strrev(char *str);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *forward = string;
printf(Before strrev(): %sn, forward);
strrev(forward);
printf(After strrev(): %sn, forward);
return 0;
}

函數名: strset
: 將一個串中的所有字符都設為指定字符
: char *strset(char *str, char c);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10] = 123456789;
char symbol = 'c';
printf(Before strset(): %sn, string);
strset(string, symbol);
printf(After strset(): %sn, string);
return 0;
}



函數名: strspn
: 在串中查找指定字符集的子集的第一次出現
: int strspn(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
#include <alloc.h>
int main(void)
{
char *string1 = 1234567890;
char *string2 = 123DC8;
int length;
length = strspn(string1, string2);
printf(Character where strings differ is at position %dn, length);
return 0;
}


函數名: strstr
: 在串中查找指定字符串的第一次出現
: char *strstr(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *str1 = Borland International, *str2 = nation, *ptr;
ptr = strstr(str1, str2);
printf(The substring is: %sn, ptr);
return 0;
}


函數名: strtod
: 將字符串轉換為double型值
: double strtod(char *str, char **endptr);
程序例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char input[80], *endptr;
double value;
printf(Enter a floating point number:);
gets(input);
value = strtod(input, &endptr);
printf(The string is %s the number is %lfn, input, value);
return 0;
}



函數名: strtok
: 查找由在第二個串中指定的分界符分隔開的單詞
: char *strtok(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char input[16] = abc,d;
char *p;
/* strtok places a NULL terminator
in front of the token, if found */
p = strtok(input, ,);
if (p) printf(%sn, p);
/* A second call to strtok using a NULL
as the first parameter returns a pointer
to the character following the token */
p = strtok(NULL, ,);
if (p) printf(%sn, p);
return 0;
}



函數名: strtol
: 將串轉換為長整數
: long strtol(char *str, char **endptr, int base);
程序例:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *string = 87654321, *endptr;
long lnumber;
/* strtol converts string to long integer */
lnumber = strtol(string, &endptr, 10);
printf(string = %s long = %ldn, string, lnumber);
return 0;
}

函數名: strupr
: 將串中的小寫字母轉換為大寫字母
: char *strupr(char *str);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string = abcdefghijklmnopqrstuvwxyz, *ptr;
/* converts string to upper case characters */
ptr = strupr(string);
printf(%sn, ptr);
return 0;
}



函數名: swab
: 交換字節
: void swab (char *from, char *to, int nbytes);
程序例:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char source[15] = rFna koBlrna d;
char target[15];
int main(void)
{
swab(source, target, strlen(source));
printf(This is target: %sn, target);
return 0;
}

2011/02/12

printf & sprintf

printf

 1.一般格式

  printf(格式控制,輸出表列)

  例如:printf("i=%d,ch=%c\n",i,ch);

  說明:

  (1)「格式控制」是用雙撇號括起來的字符串,也稱「轉換控制字符串」,它包括兩種信息:

  ①格式說明:由「%」和格式字符組成,它的作用是將輸出的數據轉換為指定的格式輸出。

  ②普通字符,即需要原樣輸出的字符。

  (2)「輸出表列」是需要輸出的一些數據,可以是表達式

  (3)printf函數的一般形式可以表示為

  printf(參數1,參數2,……,參數n)

  功能是將參數2~參數n按參數1給定的格式輸出

  2.格式字符(9種)

  (1)d(或i)格式符。用來輸出十進制整數,有以下幾種用法:

  ①%d,按整型數據的實際長度輸出。

  ②%md,m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補以空格,若大於m,則按實際位數輸出。

  ③%ld(%mld 也可),輸出長整型數據。

  例如:long a=123456;

  printf("%ld",a);

  (2)o格式符,以八進制數形式輸出整數。格式:%o,%mo,%lo,%mlo都可。

  (3)x(或X)格式符,以十六進制數形式輸出整數。格式:%x,%mx,%lx,%mlx都可。

  (4)u格式符,用來輸出unsigned型數據,即無符號數,以十進制數形式輸出。格式:%u,%mu,%lu都可。

  參見:li4-3.c

  (5)c格式符,用來輸出一個字符。格式:%c,%mc都可。

  (6)s格式符,用來輸出一個字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。

sprintf

  sprintf 將字串格式化。
  在頭文件 #include<stdio.h>中
  語法: string sprintf(string format, mixed [args]...);
  傳回值: 字串
  1. 處理字符方向。-負號時表時從後向前處理。
  2. 填空字元。 0 的話表示空格填 0;空格是內定值,表示空格就放著。
  3. 字符總寬度。為最小寬度。
  4. 精確度。指在小數點後的浮點數位數。
  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  轉換字符
  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  % 印出百分比符號,不轉換。
  b 整數轉成二進位。
  c 整數轉成對應的 ASCII 字元。
  d 整數轉成十進位。
  f 倍精確度數字轉成浮點數。
  o 整數轉成八進位。
  s 整數轉成字串。
  x 整數轉成小寫十六進位。
  X 整數轉成大寫十六進位。
  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  <?
  $money = 123.1
  $formatted = sprintf ("%06.2f", $money); // 此時變數 $ formatted 值為 "123.10"
  $formatted = sprintf ("%08.2f", $money); // 此時變數 $ formatted 值為 "00123.10"
  $formatted = sprintf ("%-08.2f", $money); // 此時變數 $ formatted 值為 "123.1000"
  $formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化為百分比
  ?>
  ¢%08.2f 解釋:
  %開始符
  0是 "填空字元" 表示,如果長度不足時就用0來填滿。
  6格式化後總長度
  2f小數位長度,即2位
  ¢第4行值為"00123.10" 解釋:
  因為2f是(2位)+小數點符號(1)+前面123(3位)=6位,總長度為8位,故前面用[填空字元]0表示,即00123.10
  ¢第4行值為"-123.1000" 解釋:
  -號為反向操作,然後填空字元0添加在最後面了
  
  在將各種類型的數據構造成字符串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟printf 在用法上幾乎一樣,只是打印的目的地不同而已,前者打印到字符串中,後者則直接在命令行上輸出。這也導致sprintf 比printf 有用得多。
  sprintf 是個變參函數,定義如下:
  int sprintf( char *buffer, const char *format [, argument] ... );
  除了前兩個參數類型固定外,後面可以接任意多個參數。而它的精華,顯然就在第二個參數:
  格式化字符串上。
  printf 和sprintf 都使用格式化字符串來指定串的格式,在格式串內部使用一些以「%」開頭的格式說明符(format specifications)來佔據一個位置,在後邊的變參列表中提供相應的變量,最終函數就會用相應位置的變量來替代那個說明符,產生一個調用者想要的字符串。
  格式化數字字符串
  sprintf 最常見的應用之一莫過於把整數打印到字符串中,所以,spritnf 在大多數場合可以替代
  itoa。
  如:
  //把整數123 打印成一個字符串保存在s 中。
  sprintf(s, "%d", 123); //產生"123"
  可以指定寬度,不足的左邊補空格:
  sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"
  當然也可以左對齊:
  sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"
  也可以按照16 進制打印:
  sprintf(s, "%8x", 4567); //小寫16 進制,寬度佔8 個位置,右對齊
  sprintf(s, "%-8X", 4568); //大寫16 進制,寬度佔8 個位置,左對齊
  這樣,一個整數的16 進制字符串就很容易得到,但我們在打印16 進制內容時,通常想要一種左邊補0 的等寬格式,那該怎麼做呢?很簡單,在表示寬度的數字前面加個0 就可以了。
  sprintf(s, "%08X", 4567); //產生:"000011D7"
  上面以」%d」進行的10 進制打印同樣也可以使用這種左邊補0 的方式。
  這裡要注意一個符號擴展的問題:比如,假如我們想打印短整數(short)-1 的內存16 進製表示形式,在Win32 平台上,一個short 型佔2 個字節,所以我們自然希望用4 個16 進制數字來打印它:
  short si = -1;
  sprintf(s, "%04X", si);
  產生「FFFFFFFF」,怎麼回事?因為spritnf 是個變參函數,除了前面兩個參數之外,後面的參數都不是類型安全的,函數更沒有辦法僅僅通過一個「%X」就能得知當初函數調用前參數壓棧時被壓進來的到底是個4 字節的整數還是個2 字節的短整數,所以採取了統一4 字節的處理方式,導致參數壓棧時做了符號擴展,擴展成了32 位的整數-1,打印時4 個位置不夠了,就把32 位整數-1 的8 位16 進制都打印出來了。
  如果你想看si 的本來面目,那麼就應該讓編譯器做0 擴展而不是符號擴展(擴展時二進制左邊補0 而不是補符號位):
  sprintf(s, "%04X", (unsigned short)si);
  就可以了。或者:
  unsigned short si = -1;
  sprintf(s, "%04X", si);
  sprintf 和printf 還可以按8 進制打印整數字符串,使用」%o」。注意8 進制和16 進制都不會打
  印出負數,都是無符號的,實際上也就是變量的內部編碼的直接的16 進制或8 進製表示。
  控制浮點數打印格式
  浮點數的打印和格式控制是sprintf 的又一大常用功能,浮點數使用格式符」%f」控制,默認保
  留小數點後6 位數字,比如:
  sprintf(s, "%f", 3.1415926); //產生"3.141593"
  但有時我們希望自己控制打印的寬度和小數位數,這時就應該使用:」%m.nf」格式,其中m 表
  示打印的寬度,n 表示小數點後的位數。比如:
  sprintf(s, "%10.3f", 3.1415626); //產生:" 3.142"
  sprintf(s, "%-10.3f", 3.1415626); //產生:"3.142 "
  sprintf(s, "%.3f", 3.1415626); //不指定總寬度,產生:"3.142"
  注意一個問題,你猜
  int i = 100;
  sprintf(s, "%.2f", i);
  會打出什麼東東來?「100.00」?對嗎?自己試試就知道了,同時也試試下面這個:
  sprintf(s, "%.2f", (double)i);
  第一個打出來的肯定不是正確結果,原因跟前面提到的一樣,參數壓棧時調用者並不知道跟i相對應的格式控制符是個」%f」。而函數執行時函數本身則並不知道當年被壓入棧裡的是個整數,於是可憐的保存整數i 的那4 個字節就被不由分說地強行作為浮點數格式來解釋了,整個亂套了。不過,如果有人有興趣使用手工編碼一個浮點數,那麼倒可以使用這種方法來檢驗一下你手工編排的結果是否正確。
  字符/Ascii 碼對照
  我們知道,在C/C++語言中,char 也是一種普通的scalable 類型,除了字長之外,它與short,
  int,long 這些類型沒有本質區別,只不過被大家習慣用來表示字符和字符串而已。(或許當年該把
  這個類型叫做「byte」,然後現在就可以根據實際情況,使用byte 或short 來把char 通過typedef 定義出來,這樣更合適些)於是,使用」%d」或者」%x」打印一個字符,便能得出它的10 進制或16 進制的ASCII 碼;反過來,使用」%c」打印一個整數,便可以看到它所對應的ASCII 字符。以下程序段把所有可見字符的ASCII 碼對照表打印到屏幕上(這裡採用printf,注意」#」與」%X」合用時自動為16 進制數增加」0X」前綴):
  for(int i = 32; i < 127; i++) {
  printf("[ %c ]: %3d 0x%#04X\n", i, i, i);
  }
  連接字符串
  sprintf 的格式控制串中既然可以插入各種東西,並最終把它們「連成一串」,自然也就能夠連
  接字符串,從而在許多場合可以替代strcat,但sprintf 能夠一次連接多個字符串(自然也可以同時
  在它們中間插入別的內容,總之非常靈活)。比如:
  char* who = "I";
  char* whom = "CSDN";
  sprintf(s, "%s love %s.", who, whom); //產生:"I love CSDN. "
  strcat 只能連接字符串(一段以』』結尾的字符數組或叫做字符緩衝,null-terminated-string),但有時我們有兩段字符緩衝區,他們並不是以 』』結尾。比如許多從第三方庫函數中返回的字符數組,從硬件或者網絡傳輸中讀進來的字符流,它們未必每一段字符序列後面都有個相應的』』來結尾。如果直接連接,不管是sprintf 還是strcat 肯定會導致非法內存操作,而strncat 也至少要求第一個參數是個null-terminated-string,那該怎麼辦呢?我們自然會想起前面介紹打印整數和浮點數時可以指定寬度,字符串也一樣的。比如:
  char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
  char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
  如果:
  sprintf(s, "%s%s", a1, a2); //Don't do that!
  十有八九要出問題了。是否可以改成:
  sprintf(s, "%7s%7s", a1, a2);
  也沒好到哪兒去,正確的應該是:
  sprintf(s, "%.7s%.7s", a1, a2);//產生:"ABCDEFGHIJKLMN"
  這可以類比打印浮點數的」%m.nf」,在」%m.ns」中,m 表示佔用寬度(字符串長度不足時補空格,超出了則按照實際寬度打印),n 才表示從相應的字符串中最多取用的字符數。通常在打印字符串時m 沒什麼大用,還是點號後面的n 用的多。自然,也可以前後都只取部分字符:
  sprintf(s, "%.6s%.5s", a1, a2);//產生:"ABCDEFHIJKL"
  在許多時候,我們或許還希望這些格式控制符中用以指定長度信息的數字是動態的,而不是靜態指定的,因為許多時候,程序要到運行時才會清楚到底需要取字符數組中的幾個字符,這種動態的寬度/精度設置功能在sprintf 的實現中也被考慮到了,sprintf 採用」*」來佔用一個本來需要一個指定寬度或精度的常數數字的位置,同樣,而實際的寬度或精度就可以和其它被打印的變量一樣被提供出來,於是,上面的例子可以變成:
  sprintf(s, "%.*s%.*s", 7, a1, 7, a2);
  或者:
  sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);
  實際上,前面介紹的打印字符、整數、浮點數等都可以動態指定那些常量值,比如:
  sprintf(s, "%-*d", 4, 'A'); //產生"65 "
  sprintf(s, "%#0*X", 8, 128); //產生"0X000080","#"產生0X
  sprintf(s, "%*.*f", 10, 2, 3.1415926); //產生" 3.14"
  打印地址信息
  有時調試程序時,我們可能想查看某些變量或者成員的地址,由於地址或者指針也不過是個32 位的數,你完全可以使用打印無符號整數的」%u」把他們打印出來:
  sprintf(s, "%u", &i);
  不過通常人們還是喜歡使用16 進制而不是10 進制來顯示一個地址:
  sprintf(s, "%08X", &i);
  然而,這些都是間接的方法,對於地址打印,sprintf 提供了專門的」%p」:
  sprintf(s, "%p", &i);
  我覺得它實際上就相當於:
  sprintf(s, "%0*x", 2 * sizeof(void *), &i);
  利用sprintf 的返回值
  較少有人注意printf/sprintf 函數的返回值,但有時它卻是有用的,spritnf 返回了本次函數調用
  最終打印到字符緩衝區中的字符數目。也就是說每當一次sprinf 調用結束以後,你無須再調用一次
  strlen 便已經知道了結果字符串的長度。如:
  int len = sprintf(s, "%d", i);
  對於正整數來說,len 便等於整數i 的10 進制位數。
  下面的是個完整的例子,產生10 個[0, 100)之間的隨機數,並將他們打印到一個字符數組s 中,
  以逗號分隔開。
  #include
  #include
  #include
  int main() {
  srand(time(0));
  char s[64];
  int offset = 0;
  for(int i = 0; i < 10; i++) {
  offset += sprintf(s + offset, "%d,", rand() % 100);
  }
  s[offset - 1] = '\n';//將最後一個逗號換成換行符。
  printf(s);
  return 0;
  }
  設想當你從數據庫中取出一條記錄,然後希望把他們的各個字段按照某種規則連接成一個字
  符串時,就可以使用這種方法,從理論上講,他應該比不斷的strcat 效率高,因為strcat 每次調用
  都需要先找到最後的那個』』的位置,而在上面給出的例子中,我們每次都利用sprintf 返回值把這
  個位置直接記下來了。
  使用sprintf 的常見問題
  sprintf 是個變參函數,使用時經常出問題,而且只要出問題通常就是能導致程序崩潰的內存訪
  問錯誤,但好在由sprintf 誤用導致的問題雖然嚴重,卻很容易找出,無非就是那麼幾種情況,通
  常用眼睛再把出錯的代碼多看幾眼就看出來了。
  ?? 緩衝區溢出
  第一個參數的長度太短了,沒的說,給個大點的地方吧。當然也可能是後面的參數的問
  題,建議變參對應一定要細心,而打印字符串時,儘量使用」%.ns」的形式指定最大字符數。
  ?? 忘記了第一個參數
  低級得不能再低級問題,用printf 用得太慣了。//偶就常犯。:。(
  ?? 變參對應出問題
  通常是忘記了提供對應某個格式符的變參,導致以後的參數統統錯位,檢查檢查吧。尤
  其是對應」*」的那些參數,都提供了嗎?不要把一個整數對應一個」%s」,編譯器會覺得你
  欺她太甚了(編譯器是obj 和exe 的媽媽,應該是個女的,:P)。
  strftime
  sprnitf 還有個不錯的表妹:strftime,專門用於格式化時間字符串的,用法跟她表哥很像,也
  是一大堆格式控制符,只是畢竟小姑娘家心細,她還要調用者指定緩衝區的最大長度,可能是為
  了在出現問題時可以推卸責任吧。這裡舉個例子:
  time_t t = time(0);
  //產生"YYYY-MM-DD hh:mm:ss"格式的字符串。
  char s[32];
  strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
  sprintf 在MFC 中也能找到他的知音:CString::Format,strftime 在MFC 中自然也有她的同道:
  CTime::Format,這一對由於從面向對象哪裡得到了贊助,用以寫出的代碼更覺優雅

2010/07/01

"ASP.NET " 網頁 Server Application Unavailable 錯誤

Server Application Unavailable

The web application you are attempting to access on this web server is currently unavailable. Please hit the "Refresh" button in your web browser to retry your request.

Administrator Note: An error message detailing the cause of this specific request failure can be found in the application event log of the web server. Please review this log entry to discover what caused this error to occur.



附命令行下卸載和安裝asp.net

1.Open a command prompt
2.Stop IIS:「iisreset/stop「
3.Change to the .NET Framework 2.0 root directory:「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727「
4.Stop web services: "net stop w3svc"
5.Uninstall all instances of ASP.NET from IIS: "aspnet_regiis.exe -ua"
6.Reinstall ASP.NET into IIS: "aspnet_regiis.exe -i"
7.Restart web services:「net start w3svc「
8.Restart IIS:「iisreset/start「

Server   Application   Unavailable

The WEB Application You Are Attempting To Access On This WEB Server Is Currently Unavailable. Please Hit   The   「Refresh」   Button   In   Your   WEB   Browser   To   Retry   Your   Request.

Administrator   Note:   An   Error   Message   Detailing   The   Cause   Of   This   Specific   Request   Failure   Can   Be   Found   In   The   Application   Event   Log   Of   The   WEB   Server.   Please   Review   This   Log   Entry   To   Discover   What   Caused   This   Error   To   Occur.



2010/04/26

windows 2008 開關機

取消登錄時要按 Ctrl+Alt+Delete組合鍵登錄的方法

    點桌面任務欄的「開始-->運行」在彈出的窗口中輸入gpedit.msc 。

    輸入gpedit.msc後,點擊確定即打開了組策略編輯器。在組策略編輯器的左框內依次序展開(點前面的「+」號)-->計算機配置 -->Windows設置-->安全設置-->本地策略,這時在本地策略下面可見到有「安全選項」,點擊「安全選項」在右側的框內找到 「交互式登錄:不要按CTRL+ALT+DEL」 。

    右鍵點擊「交互式登錄:不要按CTRL+ALT+DEL」,在彈出的菜單中點「屬性」,在屬性選項卡中點擊「已啟用」前的圓圈以選取它。

    確認「已啟用」前面的圓圈中在一黑色小點後,點擊「確定」,然後關閉窗口。這樣以後啟動計算機時就不必按「CTRL+ALT+DEL」組合鍵登陸了。

  取消關機原因的提示

    gpedit.msc,計算機配置 -> 管理模板 -> 系統 -> 顯示關機事件跟蹤 -> 禁用。

  取消必須輸入密碼登錄系統的方法

    gpedit.msc,計算機配置-WINDOWS設置-安全設置-帳戶策略-密碼策略。在這個路徑下找到「密碼必須符合複雜性要求」設置為禁用,「密碼 長度最小值」設置為0。這樣你就可以創建空密碼的用戶帳戶了 。

2010/04/07

開啟Administrator帳戶

下列方法都可以開啟Administrator帳戶

lusrmgr.msc

net user administrator /active:yes
net user administrator /active:no

secpol.msc

gpedit.msc

2010/01/10

列出資料夾的樹狀結構



我是把 tree 指令加到 Vista 資料夾與磁碟的右鍵選單的隱藏選項,參考看看:
把以下內容複製,存成 .reg 檔,點兩下即可。


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\FolderTree]
@="列出資料夾的樹狀結構"
"Extended"=""

[HKEY_CLASSES_ROOT\Directory\shell\FolderTree\command]
@="cmd.exe /c \"tree \"%v\" /f > C:\\資料夾的樹狀結構.txt\""

[HKEY_CLASSES_ROOT\Drive\shell\FolderTree]
@="列出磁碟的樹狀結構"
"Extended"=""

[HKEY_CLASSES_ROOT\Drive\shell\FolderTree\command]
@="cmd.exe /c \"tree \"%v\" /f > C:\\磁碟的樹狀結構.txt\""


使用方法:點選資料夾或磁碟並按著 Shift 鍵不放,再按下滑鼠右鍵,
然後點選﹝列出資料夾(磁碟)的樹狀結構﹞就會將結果輸出到 C :\。
:Windows XP 可能不支援紅色部分,請刪除紅色部分。



出處

2009/09/16

網路關機

我找到方法了

在要進行關機的電腦上,按下開始-執行,然後在執行對話盒輸入gpedit.msc再按下確定
群組原則視窗出現後,找到本機電腦原則-電腦設定-Windows設定這個項目,然後依序展開安全性設定-本機原則,最後在使用者權限指派上按一下滑鼠左鍵。
在右邊窗格找到從遠端榭統強制關機,然後在這個項目上按一下滑鼠右鍵,從選單中選內容
對話盒出現後,裡面只有Administrator這個使用者,在新增使用者或群組上按一下滑鼠左鍵,準備將Guest使用者新增進來
選擇使用或群組對話盒出現後,在下方的進階上按一下滑鼠左鍵。
接著在對話盒按下立即尋找,下方的方塊就會顯示所有的使用者,在
Guest使用者上按一下滑鼠左鍵,然後按下確定
現在對話盒中就會出現Guest使用者,按下確定,回到上個對話盒再按一次確定
現在到採取遙控的電腦上,建立捷徑圖示來進行遠端關機,先在桌面上空白的地方按一下滑鼠右鍵,依序點選新增-捷徑
建立捷徑對話盒出現後,輸入shutdown -s -m 電腦名稱或ip -t 3格式的指令,再按下一步
最後設定捷徑的名稱,如遠端關機,再按下完成,以後只要在建立好的捷徑圖示上連續按兩下滑鼠左鍵,就可以讓家裡的電腦關機了。

2009/05/07

VB6 二進位資料 轉 數值

VB6 二進位資料 轉 數值
當我們有二進位資料 如 &H3483126f
如何才能轉成 2.44141e-7 數值
使用 CopyMemory 函數 參考如下

範例:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Dim lVar As Long
Dim iLoop As Integer
Dim bArray(1 To 4) As Byte

lVar = &H40030201

CopyMemory bArray(1), lVar, 4
For iLoop = 1 To 4
   If bArray(iLoop) And &HF0 Then
      Debug.Print Hex$(bArray(iLoop));
   Else
      Debug.Print "0" & Hex$(bArray(iLoop));
   End If
Next

這段程式把 lVar 的值原封不動地複製到 bArray 之中,由於 lVar 的大小為 4 個位元組,因此我們設定 bArray 的元素個數為 4 個。Array 在下下期電子期將會被介紹到,在這�暫時只要知道數字陣列的元素在記憶體中是連續的就好了。用白話來解釋 CopyMemory bArray(1), lVar, 4 這行程式碼是:
將由 lVar 變數起始的 4 個位元組複製到由 bArray(1) 起始 4 位元組大小的位元區塊。

由 lVar = &H40030201 我們知道了 lVar 的內容。最後一部分的 For…Next 是將 bArray 中複製的內容印在即時視窗中以便與 lVar 的內容對照。如果您把程式放到 VB 中執行,您將會得到結果:01020340!

咦?lVar 的內容為 40030201 呀,怎麼我們得到 01020340 呢?這到底是怎麼一回事?

這個問題牽涉到電腦二進位資料儲存的順序,叫做 Little Endian。簡單的說 little endian 是指資料儲存時的順序將是低順位的位元儲存在較低位址的記憶體中,當 CPU 由記憶體中讀取資料時,由較低的位址開始讀起。因此在上例中當 lVar 引數傳 CopyMemory 中時,所傳入的記憶體位址是位元值 01 的最低順位位元,之後由低往高讀上去,所以在 bArray 中的元素值才會是顛倒的。

參考處:
http://tlcheng.twbbs.org/Paper/Variant/Variant.htm

http://mychannel.pchome.com.tw/channel/class/show_preview.php3/?d=2002-07-18&enname=winapi4vber&t=.htm&fn=main&view=1

2009/01/08

VB6 動態新增控制項物件

【方法一】增加動態物件陣列

新增方法:
Laod ObjectArray(Index),如 Load Text1(10)。

    《注意事項》
        1.最初物件陣列必須先存在,如 Text1(0)。
        2.引數Index不可以重複。
    優點:
        Load 新增的控制項物件會繼承(Inheritance)原先控制項物件的屬性設定,
        如 Text1(10). MultiLine = True 會自動設定,這個屬性在執行時期無法動態更改。

刪除方法:
Unload ObjectArray(Index) ,如 Unload Text1(10)。

事件觸發:
Private Sub Text1_Change(Index As Integer)
    Select Case Index
    Case 1
        '..... 觸發的控制項
    End Select
End Sub


【方法二】控制項集合(Controls collection)

新增方法:
Set ControlRef=Controls.Add(ProgID,Name [,Container])

    說明:
        1.ProgID是指控制項的類別名稱,它是 Libraryname.controlname 的格式。
        2.Name 是您給控制項的名稱, (這就是控制項Name屬性所傳回名稱) 。
            Name 必需為唯一的(unique),假如在集合中有其它的控制項具有同樣
            的名稱,就會產生
            Error 727 "There is already a control with the name 'ctrlname'" 。
        3.Container 為選擇性參數,是一個對收納器控制項(如PictureBox 或
            是Frame控制項)的引用,如果沒有指定或為 NULL,預設值
            為Controls 集合物件所屬的收納器。
        4.ControlRef 為物件變數,是一個對該控制項的引用,透過此變數可
            使用控制項的屬性,方法及事件,由底下的程式碼您可以發現要在
            表單右下角,動態新增一個控制項,是非常容易的一件事。

範例:
Private Sub Command1_Click()
    Set textCtrl1 = Controls.Add("vb.textbox", "textCtrl1")
    textCtrl1.Text = "textCtrl1"
    textCtrl1.Visible = True
    Set textCtrl2 = Controls.Add("vb.textbox", "textCtrl2")
    textCtrl2.Top = 500
    textCtrl2.Text = "textCtrl2"
    textCtrl2.Visible = True
End Sub

優點:
無須最初物件陣列 textCtrl(0),便可以無中生有來動態新增控制項。


刪除方法:
Controls.Remove Control

範例:
Private Sub Command3_Click()
    UnLoadCtrl "textCtrl1"
End Sub

Private Sub UnLoadCtrl(ByVal ctrlName As String)
    Dim Ctrls As Control
    For Each Ctrls In Controls
        If Ctrls.Name = ctrlName Then Controls.Remove Ctrls
    Next
End Sub


    《注意事項》
        Controls.Remove Control 只能刪除Controls.Add 所建立之物件,不然會發生執行階段錯誤 729。

事件觸發:
使用到 WithEvents 變數可以讓您對它的事件作處理。
Option Explicit
'--- textCtrl 先設定 Events
Dim WithEvents textCtrl1 As TextBox
Dim WithEvents textCtrl2 As TextBox

Private Sub textCtrl1_Change()
    Me.Caption = "textCtrl1_Change"
End Sub
Private Sub textCtrl1_GotFocus()
    Me.Caption = "textCtrl1_GotFocus"
End Sub
Private Sub textCtrl2_Change()
    Me.Caption = "textCtrl2_Change"
End Sub
Private Sub textCtrl2_GotFocus()
    Me.Caption = "textCtrl2_GotFocus"
End Sub

《問題》每一次新增控制項就要先設定 WithEvents,使用上非常不方便。

【以下範例可改良上面 WithEvents 的不方便,使用 SubClassing 方法】
Command2_Click 動態新增物件的手法

' 於表單
Option Explicit
'--- textCtrl 設定 Events
Dim WithEvents textCtrl1 As TextBox
Dim WithEvents textCtrl2 As TextBox

Private Sub Command1_Click()
    Set textCtrl1 = Controls.Add("vb.textbox", "textCtrl1")
    textCtrl1.Text = "textCtrl1"
    textCtrl1.Visible = True
    Set textCtrl2 = Controls.Add("vb.textbox", "textCtrl2")
    textCtrl2.Top = 500
    textCtrl2.Text = "textCtrl2"
    textCtrl2.Visible = True
End Sub

'----- 新增10個 TextBox 控制項 ( Controls.Add )
Private Sub Command2_Click()
    Dim txtArray As Object
    Dim Index As Long
    Dim str As String
    '新增10個 TextBox
    Index = 10
    ReDim CtrlhWnd(Index - 1)
    For Index = 0 To Index - 1
        str = "txtArray" & Index
        Set txtArray = Controls.Add("vb.textbox", str)
        With txtArray
            .Top = Index * 300
            .Left = 1300
            .Height = 280
            .Width = 1000
            .Text = str
            .Visible = True
            CtrlhWnd(Index) = .hwnd
        End With
    Next
    '--- txtArray 設定 Events
    MeProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Private Sub Command3_Click()
    UnLoadCtrl "textCtrl1"
End Sub
Private Sub UnLoadCtrl(ByVal ctrlName As String)
    Dim Ctrls As Control
    For Each Ctrls In Controls
        If Ctrls.Name = ctrlName Then Controls.Remove Ctrls
    Next
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hwnd, GWL_WNDPROC, MeProc
End Sub

'---------- ALL Events()
Private Sub textCtrl1_Change()
    Me.Caption = "textCtrl1_Change"
End Sub
Private Sub textCtrl1_GotFocus()
    Me.Caption = "textCtrl1_GotFocus"
End Sub

Private Sub textCtrl2_Change()
    Me.Caption = "textCtrl2_Change"
End Sub
Private Sub textCtrl2_GotFocus()
    Me.Caption = "textCtrl2_GotFocus"
End Sub

Public Sub txtArray_Change(Index As Integer)
    Me.Caption = "txtArray" & Index & "_Change"
End Sub
Public Sub txtArray_GotFocus(Index As Integer)
    Me.Caption = "txtArray" & Index & "_GotFocus"
End Sub


' 於模組
Option Explicit
Public Type LongToByte
    B0 As Byte
    B1 As Byte
    B2 As Byte
    B3 As Byte
End Type
Public bLong As LongToByte
Public Const WM_COMMAND = &H111
Public Const GWL_WNDPROC = (-4)
Public MeProc As Long
Public CtrlhWnd() As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
    Case WM_COMMAND
        Dim Index As Integer
        For Index = 0 To UBound(CtrlhWnd)
            If lParam = CtrlhWnd(Index) Then
                CopyMemory bLong, wParam, 4
                Select Case bLong.B3
                Case &H3
                    Form1.txtArray_Change (Index)
                Case &H1
                    Form1.txtArray_GotFocus (Index)
                End Select
            End If
        Next
    End Select
    WindowProc = CallWindowProc(MeProc, hwnd, uMsg, wParam, lParam)
End Function




2008/08/04

自動關機 指令 shutdown.exe

通過調用Windows XP系統目錄下的shutdown.exe文件就可以了,
它的位置放在windows\system32中。這個文件就是Windows自帶的
關機程式只不過是被隱藏起來了不太好找到。

下面舉個例子來演示一下如何設置shutdown.exe命令:

1.假如您17:00下班您需要電腦在17:01分關機,可以選擇「開始→運行」,
輸入「at 17:01 Shutdown -s」,這樣,到了17:01分電腦就會出現
「系統關機」對話方塊,默認有30秒鍾的倒計時並提示你保存工作。
如果你想以倒計時的方式關機,可以輸入「Shutdown.exe -s -t 3600」,
這裡表示60分鍾後自動關機,「3600」代表60分鍾。
如果想讓Windows 2000也實現同樣的效果,可以把Shutdown.exe複製到系統目錄下。

2.設置好自動關機後,如果想取消的話,可以在運行中輸入「shutdown -a」。
另外輸入「shutdown -i」,則可以打開設置自動關機對話方塊,對自動關機進行設置。

3.Shutdown.exe的參數,每個都具有特定的用途,執行每一個都會產生不同的效果,
比如「-s」就表示關閉本地電腦,「-a」表示取消關機操作,下面列出了更多參數,
大家可以在Shutdown.exe中按需使用。

-f:強行關閉應用程式

-m ╲╲電腦名:控制遠程電腦

-i:顯示圖形用戶界面,但必須是Shutdown的第一個選項

-l:註銷當前用戶

-r:關機並重啟

-t時間:設置關機倒計時

-c "消息內容":輸入關機對話方塊中的消息內容(不能超127個字符)

2008/07/15

建立透明文件夾(看不見可以使用)

建立透明文件夾(看不見可以使用)

建立透明文件夾
第一步:新建一文件夾,命名時先按住[Alt]鍵的同時使用小鍵盤輸入0160數字。
這樣,就得到一個只有文件夾圖標沒有名稱的文件夾。
第二步:右擊文件夾,選「屬性」,打開對話框。切換至「自定義」,單擊「更改圖標」按鈕,彈出「為文件夾更改圖標」對話框。向右拖動下面的滑塊,選擇一個為空的圖標,一路點擊「確定」按鈕,即建立一無名稱、圖標的文件夾。
一般,照名稱排列文件和文件夾裡,透明文件夾會排在第一位。所以,建議在路徑較深的空文件夾來創建,以更隱蔽。
如果忘記文件夾所在位置,可按下[Alt+A]鍵,即可找到。

2008/05/26

對稱式加解

說明 : 對稱式加解密意即可將加密後的字串做還原的動作.
適用平台:.Net Framework 1.0,1.1,2.0
 
using System.Security.Cryptography;
using System.Text;
public string EnCode(string EnString)  //將字串加密
{
  byte[] Key = {123 , 123 , 123 , 123 , 123 , 123 , 123, 123};
  byte[] IV = {123 , 123 , 123 , 123 , 123 , 123 , 123 , 123};
  byte[] b = Encoding.UTF8.GetBytes(EnString);
   
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  ICryptoTransform ict = des.CreateEncryptor(Key , IV);
  byte[] outData = ict.TransformFinalBlock(b , 0 , b.Length);
  return Convert.ToBase64String(outData);  //回傳加密後的字串
}
public string DeCode(string DeString) //將字串解密
{
  byte[] Key = {123 , 123 , 123 , 123 , 123 , 123 , 123, 123};
  byte[] IV = {123 , 123 , 123 , 123 , 123 , 123 , 123 , 123};
  byte[] b = Convert.FromBase64String(DeString);
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  ICryptoTransform ict = des.CreateDecryptor(Key , IV);
  byte[] outData = ict.TransformFinalBlock(b , 0 , b.Length);
  return Encoding.UTF8.GetString(outData) ;//回傳解密後的字串
}
用此程式碼將"TestForEnCode"這字串加密後,就變為"KMdstO1vd6pgzf1nsk3CrA==",當然,解密後,也就變回"TestForEnCode"

2008/03/14

使用OWC11 畫出統計圖表

出處

先在設計畫面的工具列新增三個項目(三個都在COM元件內).

Microsoft Office Chart 11.0
Microsoft Office PivotTable 11.0
Microsoft Office Spreadsheet 11.0

之後拉一個Microsoft Office Chart 11.0到Form上.
一個Timer
3個RadioButton.
rdb_chChartTypeLine
rdb_chChartTypeLine3D
rdb_chChartTypeLineMarkers

以下即為程式碼原始碼.

using Microsoft.Office.Interop.Owc11;
ChartChartTypeEnum _Type;
private void Form1_Load(object sender, EventArgs e)
{
    showChart(ChartChartTypeEnum.chChartTypeLine);
}

private void showChart(ChartChartTypeEnum Type)
{
    try
    {
        axChartSpace1.Clear();
        ChChart objChart = axChartSpace1.Charts.Add(0);

        objChart.Type = Type;
        objChart.HasLegend = true;
        objChart.HasTitle = true;
        objChart.Title.Caption = "數量統計";
        objChart.Axes[0].HasTitle = true;
        objChart.Axes[0].Title.Caption = "月份";
        objChart.Axes[1].HasTitle = true;
        objChart.Axes[1].Title.Caption = "個";

        objChart.SeriesCollection.Add(0);
        objChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimSeriesNames,
        +(int)ChartSpecialDataSourcesEnum.chDataLiteral, "3C");

        objChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimCategories,
        +(int)ChartSpecialDataSourcesEnum.chDataLiteral,
        "Jan" + '\t' + "Feb" + '\t' + "Mar" + '\t' + "Apr" + '\t' + "May" + '\t' + "Jun" + '\t');
        Random r = new Random(DateTime.Now.Second);
        string w1 = r.Next(300).ToString();
        string w2 = r.Next(300).ToString();
        string w3 = r.Next(300).ToString();
        string w4 = r.Next(300).ToString();
        string w5 = r.Next(300).ToString();
        string w6 = r.Next(300).ToString();
        objChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimValues,
        (int)ChartSpecialDataSourcesEnum.chDataLiteral,
        w1 + '\t' + w2 + '\t' + w3 + '\t' + w4 + '\t' + w5 + '\t' + w6 + '\t');

        objChart.SeriesCollection.Add(1);
        objChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimSeriesNames,
        +(int)ChartSpecialDataSourcesEnum.chDataLiteral, "Daily Needs");

        objChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimCategories,
        +(int)ChartSpecialDataSourcesEnum.chDataLiteral,
        "Jan" + '\t' + "Feb" + '\t' + "Mar" + '\t' + "Apr" + '\t' + "May" + '\t' + "Jun" + '\t');
        string b1 = r.Next(300).ToString();
        string b2 = r.Next(300).ToString();
        string b3 = r.Next(300).ToString();
        string b4 = r.Next(300).ToString();
        string b5 = r.Next(300).ToString();
        string b6 = r.Next(300).ToString();

        objChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimValues,
        (int)ChartSpecialDataSourcesEnum.chDataLiteral,
        b1 + '\t' + b2 + '\t' + b3 + '\t' + b4 + '\t' + b5 + '\t' + b6 + '\t');
    }
    catch (Exception ex)
    {
        timer1.Enabled = false;
        MessageBox.Show(ex.Message);
    }
    finally
    {
        _Type = Type;
    }
}

private void rdb_chChartTypeLine_CheckedChanged(object sender, EventArgs e)
{
    if (rdb_chChartTypeLine.Checked)
    {
        showChart(ChartChartTypeEnum.chChartTypeLine);
        return;
    }
    if (rdb_chChartTypeLine3D.Checked)
    {
        showChart(ChartChartTypeEnum.chChartTypeLine3D);
        return;
    }
    if (rdb_chChartTypeLineMarkers.Checked)
    {
        showChart(ChartChartTypeEnum.chChartTypeLineMarkers);
        return;
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    showChart(_Type);
}

2008/03/07

PIC TEST

2000823249239778958_rs

2008/03/06

[C#]動態陣列 使用 ArrayList

來源


using System;
using System.Collections; //記得要宣告的
public class SamplesArrayList
{
    public static void Main()
    {
        // Creates and initializes a new ArrayList.
        ArrayList myAL = new ArrayList();
        myAL.Add("Hello");
        myAL.Add("World");
        myAL.Add("!");
        // Displays the properties and values of the ArrayList.
        Console.WriteLine( "myAL" );
        Console.WriteLine( " Count: {0}", myAL.Count );
        Console.WriteLine( " Capacity: {0}", myAL.Capacity );
        Console.Write( " Values:" );
        PrintValues( myAL );
    }
    public static void PrintValues( IEnumerable myList )
    {
        foreach ( Object obj in myList )
        Console.Write( " {0}", obj );
        Console.WriteLine();
    }
}

//This code produces output similar to the following:
//myAL
//Count: 3
//Capacity: f
//Values: Hello World !

[C#]從陣列中移除一行值

原始連結


static void Main(string[])
{
//array 是固定的,不能動態去變更大小
//只能重新宣告一個新的陣例才能達到你 Remove 的需求
//一般如果是動態的,會用 ArrayList 或是 List<> 來做
string[] aryStr = { "A", "B", "C", "D" };
int removeIndex = 2;//把 C 移掉
// ======= sample 1 ==> 改用 List<string> ====
List<string> list = new List<string>();
foreach (string str in aryStr)
{
list।Add(str);
}
list।RemoveAt(removeIndex);
string[] aryStrRemoveByList = list।ToArray();
foreach (string str in aryStrRemoveByList)
{
Console।WriteLine(str);
}
Console।WriteLine(new String('=', 20));
// ======== sample 2 自已寫Method去轉,不過還是要new新的
string[] aryStrRemoveByArray = new string[aryStr।Length - 1];
int count = 0;
for (int i = 0; i < aryStr।Length; i++)
{
if (i != removeIndex)
{
aryStrRemoveByArray[count] = aryStr[i];
count++;
}
}
foreach (string str in aryStrRemoveByArray)
{
Console।WriteLine(str);
}
}

2008/02/25

C# DateTime 日期格式轉換

C#有個DateTime的物件用來處理日期的其中DateTime.ParseExact 方法(System)方法可以將日期和時間的指定字串表示轉換為其對等的DateTime
字串表示的格式必須完全符合指定的格式。
再搭配DateTime.ToString (IFormatProvider)
方法使用格式資訊,將這個執行個體的值轉換為它的對等字串表示。


// 將字串日期轉整數
// 日期字串
// 整數日期格式
private static int ParseDate(string _date)
{
    //這裡定義所有日期格式
    string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd",
    "yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd",
    "yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd",
    "yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd",
    "yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d",
    "yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d",
    "yyyy/M/d","yyy/M/d","yy/M/d","y/M/d",
    "yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
    try
    {
        //這裡來處理傳入的格式是否為日期格式,只需要簡單一行
        DateTime datetime = DateTime.ParseExact(_date, dateFormats, null, DateTimeStyles.AllowWhiteSpaces);
        int iToken = _date.IndexOf("-", 0);
        if (iToken == -1)
        iToken = _date.IndexOf("/",0);
        string iYear = _date.Substring(0, iToken);
        switch (iYear.Length)
        {
            //這裡是利用datetime.ToString(IFormatProvider)
            //的方法傳出自己想要的統一格式
            case 1:
            return Int32.Parse(datetime.ToString("yMMdd"));
            case 2:
            return Int32.Parse(datetime.ToString("yyMMdd"));
            case 3:
            return Int32.Parse(datetime.ToString("yyyMMdd"));
            case 4:
            return Int32.Parse(datetime.ToString("yyyyMMdd"));
        }
        return 0;
    }
    catch (Exception)
    {
        return 0;
    }
}

甚至時間也可以這樣來做

// 將字串時間轉換為整數時間
// 時間字串(HH:mm:ss
// HHmmss整數格式
private static int ParseTime(string _time)
{
    string[] timeFormats = { "HH:mm:ss", "HH:mm:s","HH:m:ss", "HH:m:s",
    "H:mm:ss","H:mm:s","H:m:ss","H:m:s"};
    try
    {
        DateTime datetime = DateTime.ParseExact(_time, timeFormats, null,DateTimeStyles.AllowWhiteSpaces);
        return Int32.Parse(datetime.ToString("HHmmss"));
    }
    catch(Exception)
    {
        return 0;
    }
}

2008/02/21

C# 日期 轉 農曆

System.Globalization 這個命名空間很有趣,竟然有 TaiwanCalendar 與 TaiwanLunisolarCalendar 類別!

TaiwanCalendar 是指台灣使用的曆法,也就是「民國年」的計算法。


DateTime now = DateTime.Now;
TaiwanCalendar tc = new TaiwanCalendar();

int year = tc.GetYear(now);
MessageBox.Show(year.ToString());
// Output : 96

int month = tc.GetMonth(now);
// Output : 12

int daysOfMonth = tc.GetDaysInMonth(year, month);
MessageBox.Show(daysOfMonth.ToString());
// Output : 4

TaiwanLunisolarCalendar 是指台灣使用的陰陽曆(農曆)。和 TaiwanCalendar 相同,但可以使用西元年份計算,而日期和月份則使用陰陽曆計算,真的很省事!

TaiwanLunisolarCalendar tlc = new TaiwanLunisolarCalendar();

// 取得目前支援的農曆日曆到幾年幾月幾日( 2051-02-10 )
tlc.MaxSupportedDateTime.ToShortDateString();

// 取得今天的農曆年月日
txtContent.Text =
tlc.GetYear(DateTime.Now).ToString() + "-" +
tlc.GetMonth(DateTime.Now).ToString() + "-" +
tlc.GetDayOfMonth(DateTime.Now).ToString();

C# 計算日期 是 星期幾

基姆拉爾森計算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算。
代碼如下:


//y-年,m-月,d-日期
string CaculateWeekDay(int y,int m, int d)
{
if(m==1) m=13;
if(m==2) m=14;
int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
string weekstr="";
switch(week)
{
case 1: weekstr="星期一"; break;
case 2: weekstr="星期二"; break;
case 3: weekstr="星期三"; break;
case 4: weekstr="星期四"; break;
case 5: weekstr="星期五"; break;
case 6: weekstr="星期六"; break;
case 7: weekstr="星期日"; break;
}
return weekstr;
}
調用方法:
Label2।Text=CaculateWeekDay(2004,12,9);

取得一年中某一個月天數,EX 2008/01
label4।Text = DateTime.DaysInMonth(2008,1).ToString();

先取得2月在減1天,就是1月的最後一天了.
//今天
DateTime.Now.Date.ToString();
//昨天
DateTime.Now.AddDays(-1).ToString();
//明天
DateTime.Now.AddDays(1).ToString();

//本週第1天及最後1天 (要注意的是這裡的每一週是從週日始至週六止)
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek).ToString();

//上週, 一個周是7天,上週就是本週再減去7天
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek - 7).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek - 7).ToString();

//下周
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek + 7).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek + 7).ToString();


//巧用C#裡ToString的字符格式化
//本用第1天及最後1天
DateTime.Now.ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToString();

//上個月第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToString();
//下個月第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToString();

//今年第1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToString();
//今年最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToString();

//去年第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToString();

//明年第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToString();

//本季,一年四個季度,一個季度三個月
//先把日期推到本季度第一個月,然後這個月的第一天就是本季度的第一天了
DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
//本季度的最後一天就是下季度的第一天減一
DateTime.Parse(DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToString();
//下季
DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.AddMonths(6 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToString();
//上季
DateTime.Now.AddMonths(-3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToString();

2007/10/31

隱藏資料夾 & 隱藏自己的電腦

隱藏資料夾

要想讓其他用戶無法通過網路芳鄰直接來訪問某個資料夾(例如「我的共享」資料夾),我們可以將其「隱藏」起來,具體方法如下:

右擊資料夾圖示,選項彈出快捷功能表中的「共用和安全」,在開啟的視窗中選項「共享」標籤,選項「共享該檔案夾」,在「共享名」後面的文本項中輸入共用資料夾名並在資料夾名後增加一個半形的「$」字元,最後按下「確定」儲存設定。

如果沒有在上面的視窗中給共享檔案名增加「$」符,也可以右擊該共用資料夾,選項「重新命名」將這個共享的檔案名稱後增加一個半形的「$」字元(例如「我的共享$」)。

經過這樣的操作之後,其他用戶開啟網路芳鄰時,在網路芳鄰列表中將不會看到該共用資料夾了。

如果你希望某個用戶去訪問你的這個共用資料夾,只要告訴他這個共用資料夾的絕對路徑即可,此路徑為「\\你的電腦名稱\我的共享$」,只要將其輸入到檔案總管的位址欄中並Enter鍵即可訪問了,注意:後面的「$」是必不可少的,如果少了該字元將訪問不成功。

隱藏自己的電腦

上面的方法是在區域網路內隱藏一個特定的資料夾,如果你想將自己的電腦也隱藏起來,請看:

按下「開始→執行」,在開啟的「執行」對話視窗中輸入「cmd」開啟指令行視窗,輸入「net config server /hidden:yes」,再Enter鍵就可以了,這樣,別人就無法從網路芳鄰中直接看到你的電腦,只有通過在檔案總管位址欄中輸入「\\電腦名稱」 才來訪問你的電腦。

不過,通過上面的方法只能對當前有效,以後每次重新啟動系統後要重新執行該指令才行,如果希望將自己的電腦從網路芳鄰中永久隱藏,可以通過修改註冊表來達到目的:

開啟註冊表編輯器,在左側視窗中展開「HKEY_LOCAL_MACHINE\

SYSTEM\CurrentControlSet\Services\lanmanserver\Parameters」,在右側視窗中找到DWORD檔案檔案類型值改為「1」,按「F5」重新整理註冊表即可。

回首頁