回答編集履歴

8 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 02:10  投稿

ここが問題です。
> ```C
s = tmp;           //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
~~簡単に対応できそうな方法は一つ。~~
- ~~ポインタのポインタを渡す~~ **非推奨。理由はコメント欄に記載しています。**
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
- strncpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
---
ついでに、ここも変です。
> ```C
tmp[j+1] = '0';    //末尾にNULL文字を追加
> ```
tmp[j] = '\0' としてください。
'0'はただの数字0であって、NULL文字とは呼べません。
また、jの値がループ後にどのようになっているか確認した方が良いでしょう。
現状のコードではtmp[j]の値が不定です。
7 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 02:00  投稿

ここが問題です。
> ```C
s = tmp; //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
~~簡単に対応できそうな方法は一つ。~~
- ~~ポインタのポインタを渡す~~ **非推奨。理由はコメント欄に記載しています。**
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
---
ついでに、ここも変です。
> ```C
tmp[j+1] = '0'; //末尾にNULL文字を追加
> ```
tmp[j] = '\0' としてください。
'0'はただの数字0であって、NULL文字とは呼べません。
また、jの値がループ後にどのようになっているか確認した方が良いでしょう。
現状のコードではtmp[j]の値が不定です。
6 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 02:00  投稿

ここが問題です。
> ```C
s = tmp;           //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
簡単に対応できそうな方法は一つ。
- ポインタのポインタを渡す **(ただし、変数の生存期間に充分留意すること)**
~~簡単に対応できそうな方法は一つ。~~
- ~~ポインタのポインタを渡す~~ **非推奨。理由はコメント欄に記載しています。**
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
---
ついでに、ここも変です。
> ```C
tmp[j+1] = '0';    //末尾にNULL文字を追加
> ```
tmp[j] = '\0' としてください。
'0'はただの数字0であって、NULL文字とは呼べません。
また、jの値がループ後にどのようになっているか確認した方が良いでしょう。
現状のコードではtmp[j]の値が不定です。
5 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 01:46  投稿

ここが問題です。
> ```C
s = tmp;           //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
簡単に対応できそうな方法は一つ。
- ポインタのポインタを渡す
- ポインタのポインタを渡す **(ただし、変数の生存期間に充分留意すること)**
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
---
ついでに、ここも変です。
> ```C
tmp[j+1] = '0';    //末尾にNULL文字を追加
> ```
tmp[j] = '\0' としてください。
'0'はただの数字0であって、NULL文字とは呼べません。
また、jの値がループ後にどのようになっているか確認した方が良いでしょう。
現状のコードではtmp[j]の値が不定です。
4 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 00:25  投稿

ここが問題です。
> ```C
s = tmp;           //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
簡単に対応できそうな方法は一つ。  
- ポインタのポインタを渡す  
 
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。  
- tmpを使わず、sが指し示す先を直接書き換える  
- strcpy  
 
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。  
 
---  
ついでに、ここも変です。
> ```C
tmp[j+1] = '0';    //末尾にNULL文字を追加
> ```
tmp[j] = '\0' としてください。
'0'はただの数字0であって、NULL文字とは呼べません。
また、jの値がループ後にどのようになっているか確認した方が良いでしょう。
現状のコードではtmp[j]の値が不定です。
---
簡単に対応できそうな方法は一つ。
- ポインタのポインタを渡す
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
3 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 00:24  投稿

ここが問題です。
> ```C
s = tmp;           //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
 
ついでに、ここも変です。
> ```C
tmp[j+1] = '0';    //末尾にNULL文字を追加
> ```
= '\0' か = 0 としてください。どちらかと言えば前者の方が分かり易いでしょう
tmp[j] = '\0' としてください
'0'はただの数字0であって、NULL文字とは呼べません。
 
また、jの値がループ後にどのようになっているか確認した方が良いでしょう。  
現状のコードではtmp[j]の値が不定です。  
---
簡単に対応できそうな方法は一つ。
- ポインタのポインタを渡す
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
2 追記

LouiS0616

LouiS0616 score 34202

2019/04/19 00:21  投稿

ここが問題です。
> ```C
void digit(char* s){
   ...
   s = tmp;           //ポインタが配列tmpを指すように変更
   ...
}
s = tmp;           //ポインタが配列tmpを指すように変更
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
 
ついでに、ここも変です。  
> ```C  
tmp[j+1] = '0';    //末尾にNULL文字を追加  
> ```  
 
= '\0' か = 0 としてください。どちらかと言えば前者の方が分かり易いでしょう。  
'0'はただの数字0であって、NULL文字とは呼べません。  
---
簡単に対応できそうな方法は一つ。
- ポインタのポインタを渡す
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。
1 修正

LouiS0616

LouiS0616 score 34202

2019/04/19 00:19  投稿

ここが問題です。
> ```C
void digit(char* s){
   ...
   s = tmp;           //ポインタが配列tmpを指すように変更
   ...
}
> ```
ポインタ変数自体を関数内でいくら書き換えようと、呼び出し元には影響しません。
---
簡単に対応できそうな方法は一つ。
- ポインタのポインタを渡す
あるいは、strを文字型配列として確保すれば次の二つでも良いです。
あるいは、strを文字型配列として確保すれば(**註**)、次の二つの方法も選べます。
- tmpを使わず、sが指し示す先を直接書き換える
- strcpy
- strcpy
**註:** 文字列リテラルで確保した領域は読み取り専用だった筈。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る