#5
by ぷぷぷジューシー » 3年前
みけCAT さんが書きました: ↑3年前
大量に未定義動作をしていますね。
コンパラ君...
'\0'君も確認できたし大丈夫だろう
コード:
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
#include <uchar.h>
#include <limits.h>
#include <stdlib.h>
int geturlparserfunc(const char*, char*, char*);
int main(void)
{
char hostname, pathname;
geturlparserfunc("https://youtube.com", &hostname, &pathname);
printf("ホスト名; %s\n", hostname);
printf("パッチ名: %s\n", pathname);
}
int geturlparserfunc(const char* name, char* rhost, char* rpath)
{
size_t bmfunc_rlen;
int inputlen = strlen(name) + 1;
char input[(int)inputlen];
char32_t inp32b[(int)inputlen + 1];
int arraycount1 = 0, arraycount2 = 0;
mbstate_t mbstate = 0;
char temphost[MB_LEN_MAX+5];
char temppath[MB_LEN_MAX+5];
int slashconunt = 0, colon = 0;
strcpy_s(input, inputlen, (char*)(name));
while (1){
bmfunc_rlen = mbrtoc32(&inp32b[arraycount1], &input[arraycount2], MB_LEN_MAX, &mbstate);
if ( (size_t)(-1) == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("エンコードエラー又はバイト数が足りませんの可能性があります。");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
} else if ( (size_t)(-2) == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("マルチバイト文字の可能性があります。");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
} else if ( (size_t)(-3) == bmfunc_rlen ){
arraycount1++;
continue;
} else if (( (size_t)(0) == bmfunc_rlen ) ){
break;
} else if ( (size_t)(0) < bmfunc_rlen ){
arraycount1++;
arraycount2 += (int)(bmfunc_rlen);
}
}
for (size_t n = 0; arraycount1 > n ; n++){
printf("%#x\n", inp32b[n]);
if (inp32b[n] == ':' || inp32b[n] == '/'){
if (inp32b[n] == ':'){
colon = 1;
}
if (inp32b[n] == '/'){
slashconunt+=1;
}
}
if (slashconunt > 3 && colon == 1) {
bmfunc_rlen = c32rtomb(rpath ,inp32b[n], &mbstate);
if ((size_t)(-1) == bmfunc_rlen){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
}
printf("%s\n", rpath);
}
if (slashconunt == 2 && colon == 1){
// rhost 処理
bmfunc_rlen = c32rtomb(rhost ,inp32b[n], &mbstate);
if ((size_t)(-1) == bmfunc_rlen){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
}
}
}
printf("temppath:\t %s\n", rhost);
printf("temphost:\t %s\n", rpath);
arraycount1 = 0, arraycount2 = 0, slashconunt = 0, colon = 0 , bmfunc_rlen = 0;
return 0;
}
[quote=みけCAT post_id=155902 time=1614034317 user_id=536]
大量に未定義動作をしていますね。
[/quote]
コンパラ君...
'\0'君も確認できたし大丈夫だろう
[code]
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
#include <uchar.h>
#include <limits.h>
#include <stdlib.h>
int geturlparserfunc(const char*, char*, char*);
int main(void)
{
char hostname, pathname;
geturlparserfunc("https://youtube.com", &hostname, &pathname);
printf("ホスト名; %s\n", hostname);
printf("パッチ名: %s\n", pathname);
}
int geturlparserfunc(const char* name, char* rhost, char* rpath)
{
size_t bmfunc_rlen;
int inputlen = strlen(name) + 1;
char input[(int)inputlen];
char32_t inp32b[(int)inputlen + 1];
int arraycount1 = 0, arraycount2 = 0;
mbstate_t mbstate = 0;
char temphost[MB_LEN_MAX+5];
char temppath[MB_LEN_MAX+5];
int slashconunt = 0, colon = 0;
strcpy_s(input, inputlen, (char*)(name));
while (1){
bmfunc_rlen = mbrtoc32(&inp32b[arraycount1], &input[arraycount2], MB_LEN_MAX, &mbstate);
if ( (size_t)(-1) == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("エンコードエラー又はバイト数が足りませんの可能性があります。");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
} else if ( (size_t)(-2) == bmfunc_rlen ){
printf("エラーが発生しました\n");
printf("マルチバイト文字の可能性があります。");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
} else if ( (size_t)(-3) == bmfunc_rlen ){
arraycount1++;
continue;
} else if (( (size_t)(0) == bmfunc_rlen ) ){
break;
} else if ( (size_t)(0) < bmfunc_rlen ){
arraycount1++;
arraycount2 += (int)(bmfunc_rlen);
}
}
for (size_t n = 0; arraycount1 > n ; n++){
printf("%#x\n", inp32b[n]);
if (inp32b[n] == ':' || inp32b[n] == '/'){
if (inp32b[n] == ':'){
colon = 1;
}
if (inp32b[n] == '/'){
slashconunt+=1;
}
}
if (slashconunt > 3 && colon == 1) {
bmfunc_rlen = c32rtomb(rpath ,inp32b[n], &mbstate);
if ((size_t)(-1) == bmfunc_rlen){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
}
printf("%s\n", rpath);
}
if (slashconunt == 2 && colon == 1){
// rhost 処理
bmfunc_rlen = c32rtomb(rhost ,inp32b[n], &mbstate);
if ((size_t)(-1) == bmfunc_rlen){
printf("エラーが発生しました\n");
printf("有効なワイド文字ではありません\n");
printf("エラー size_t サイズ : %zu\n", bmfunc_rlen);
break;
}
}
}
printf("temppath:\t %s\n", rhost);
printf("temphost:\t %s\n", rpath);
arraycount1 = 0, arraycount2 = 0, slashconunt = 0, colon = 0 , bmfunc_rlen = 0;
return 0;
}
[/code]