2008年11月26日 星期三

IO - 使用string型態

要使用字串型態,必需要加入

#include <string>


empty():測試字串是否為空。
用==比較兩個字串是否相同。

且可以使用C-Style的字串指定給string。

string name("caterpillar");
char str[] = "justin";
name = str;


且可以用+運算子來串接字串。

str1 = str2 + str3;
str1 = str2 + "\n";


也可以用[]指定索引來存取相對應位置的字元,就有如字元陣列的操作一般。

assign(string,start,num):從string的第start個字元取出num個字元來指定給另一個字串物件。
append(string,start,num):從string的第start個字元取出num個字元來附加至另一個字串之後。
insert(start,string):將string插入引發insert的字串物件第start個字元之後。
length():傳回字串的長度。
find(string,0):從引發find的字串物件第0個字元尋找是否有符合string的子字串。

#include < iostream>
#include < string>
using namespace std;

int main(){
  string s;
  cout << "Please input a string include the space:";
  getline(cin,s);
  cout << "You typed:" << s << endl;
  s.find("good",0);
  string::size_type loc = s.find("good",0);
  if (loc != string::npos){
    cout << "In the sentence, there is keyword \"good\" "<< endl;
  } else {
    cout << "In the sentence, there is no keyword \"good\"" << endl;
  }
  return 0;
}

如果用cin來輸入的話,是以空白為分隔,
若要輸入中含空白,就必需使用gets。
c是用gets,但是會有問題,最好還是用getline比較好,也一樣可以得到相同的結果哩。

main.cpp

#include <iostream>
#include <string>
using namespace std;

int main(){
  string s;
  cout << "Please input a string include the space:";
  getline(cin,s);
  cout << "You typed:" << s << endl;
  s.find("good",0);
  string::size_type loc = s.find("good",0);
  if (loc != string::npos){
    cout << "In the sentence, there is keyword \"good\" "<< endl;
  } else {
    cout << "In the sentence, there is no keyword \"good\"" << endl;
  }
  return 0;
}


[2008.11.29 補充]
stringstream:可用於基本型態與string型態的轉換
main.cpp

#include <sstream>
#include <iostream>
using namespace std;

int main(){
  int index = 5;
  string str1;
  stringstream sstr;
  sstr << index;
  sstr >> str1;
  cout << "the answer is " << str1 << endl;
  return 0;
}


[2008.12.19 補充]
要用string除了要包含string之外,還要用using namespace std;

[2008.12.19 補充]
另外,在C中要把數字轉成字串,可以使用sprintf


#include <stdio.h>

int main(){
  int a=100;
  char b='x';
  char c[]="abcd";
  char buf[100];
  sprintf(buf,"%3d%c%s",a,b,c); // buf是轉換完後的儲存字串

  printf("your input is %s\n",buf);

  return 0;
}


[2009.03.16 補充]
眾所周知,sprintf不能檢查目標字符串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int ac, char **av)
{
char *str;
int len;
// snprintf(NULL, 0, fmtstring, /* 其它參數 */ );
// 相對於sprintf安全的多
len = snprintf(NULL, 0, "%s %d", *av, ac);
printf("this string has length %d\n", len);
if (!(str = malloc((len + 1) * sizeof(char))))
return EXIT_FAILURE;
// 把後面的變數轉換成字串設定到str指標上
// 而len+1是後面總合長度的上限
// 超過上限的部分會被刪掉,不會印出來
len = snprintf(str, len + 1, "%s %d", *av, ac);
printf("%s %d\n", str, len);
free(str);
return EXIT_SUCCESS;
}

談談snprintf

[2009.03.22 補充]
char *strerror(int errno);
strerror, strerror_r - get error message string
若上一個函數有出現錯誤,會把錯誤號碼存到erron,可以透過strerror來取得代表此錯誤數字的訊息
網址

[2009.04.03 補充]
void perror ( const char * str );
會這把這一個字串列印在stderr,且會在最後面加'\n'的換行字元

int fprintf ( FILE * stream, const char * format, ... );
這是一個非常好用的函式,可以把後面的字串寫入到檔案中
另外有一個特殊用法,就是使用stdout,stderr可以值接設定是要輸出到哪裡
例:
fprintf(stdout,"Hello World!!");
fprintf(stderr,"Hello Error!!");

int vsprintf (char * str, const char * format, va_list arg );
int vsnprintf(char *restrict s, size_t n, const char *restrict format,va_list ap);
可以參考C/C++ : 不定長度引數(Variable-length argument)

參考資料:
C++ Strings
良葛格學習筆記

沒有留言: