Last active
May 25, 2017 18:34
-
-
Save 27Cobalter/f32b28bb7616214ed4ee51282acb28cf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
//換算率 | |
const int rate = 120; | |
int main() { | |
char str[50]; | |
printf("データを入力してください:"); | |
// 入力読みこみ | |
scanf("%[^\n]", str); | |
int i = 0; | |
// 先頭を大文字にする | |
str[0] -= 'a' <= str[0] && str[0] <= 'z' ? 0x20 : 0; | |
// 読み込んだ文字列の最初から最後までをループ | |
for (; i < sizeof(str); i++) { | |
// そのループの文字によって処理変更 | |
switch (str[i]) { | |
case 'T': // その文字がTだったらタブ文字に変更 | |
str[i] = '\t'; | |
break; | |
case 'N': // その文字がNだったら改行文字に変更 | |
str[i] = '\n'; | |
// 改行した次の文字が小文字のアルファベットだったら大文字に変更 | |
str[i + 1] -= 'a' <= str[i + 1] && str[i + 1] <= 'z' ? 0x20 : 0; | |
break; | |
case '+': // その文字が+だったらスペースに変更 | |
str[i] = ' '; | |
break; | |
case '$': // その文字が$だったら特殊処理 | |
str[i] = '\\'; // まず$を\(円マーク)に変更 | |
int st = str[i + 1] == '0' ? i + 2 : i + 1; // \の次の文字が0なら残す | |
int j = st; | |
int len = 0; | |
int num = 0; | |
for (; '0' <= str[j] && str[j] <= '9'; j++) { // $または0に続く数列を数値に変換 | |
num = num * 10 + str[j] - '0'; | |
} | |
num *= rate; // レートを掛けて$を円に両替 | |
char nu[10] = "0"; | |
int k = 0; | |
for (; num > 0; k++, num /= 10) { // 数値を一桁づつ文字に変換し、nuに格納(ただし、順番は逆) | |
nu[k] = num % 10 + '0'; | |
len++; | |
} | |
char tmp[40]; | |
strcpy(tmp, str + j); // 数字の後を退避 | |
int l = len - 1; | |
for (; l >= 0; l--) { | |
str[st + l] = nu[len - l - 1]; // 数値を入れる | |
} | |
strcpy(str + st + len, tmp); // 数字の後に退避させた部分をつなぐ | |
i = st + len - 1; // iの位置を処理した数字の後に持ってくる | |
} | |
} | |
printf("%s\n", str); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment