質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2943閲覧

ポインタを使って文字列の長さを求めたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/22 07:14

編集2020/05/22 09:00

どうしてもポインタが理解できないです。挫折しそうです。
今回はポインタを使って文字列の長さを求めるコードですが。どうしても与えられた文字をカウントせずに1が表れてしまいます。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int change_letter(char* ptr) { int i=0; i = i + 1; return i; } void main() { char buffer[128]; char* ptr = buffer; int i=0; scanf("%s", buffer); printf("%s\n", ptr); while (*ptr != 0) { i= change_letter(ptr); ptr++; } printf("%d\n", i); }

自分のコードだと、与えられた文字列を使ってwhile文で次の配列とカウントするようにしていますが。ブレークポイントを用いると関数から受け取った後、整数としてではなく、あり得ない数字が渡り、そのまま1とループしている状態であります。
どうかご協力を願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

change_letterは何のために呼び出しているのでしょうか。この関数は、どんなchar *を引数にしても1を返します

投稿2020/05/22 07:23

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/22 08:47

考え方としては、受け取った文字列をchange_letterとして、与えられた文字列の分カウントして、そのままカウントした数字をメイン関数に返して、表示しようとしています
maisumakun

2020/05/22 09:45

change_letterに拘る必要はありません。while (*ptr != 0)のループ内で直接数えたほうが適切です。
maisumakun

2020/05/22 09:49 編集

> これはポインタの問題ではなくwhileの場所の問題だと思うのですが(次質問より) いえ、whileは適切な回数だけ回っています。その中でする処理の問題です。
退会済みユーザー

退会済みユーザー

2020/05/22 10:11

main関数内でwhile文を使って長さを測る方法が上の方法だと思いましたが、この方法だとchange_letter内で+1した後、その関数内でカウントしていないことが原因ですか?
maisumakun

2020/05/22 10:18

> change_letter内で+1した後 ローカル変数に1を足しているだけなので、関数の外では1を足した影響は(返り値を除けば)ありません。
退会済みユーザー

退会済みユーザー

2020/05/22 10:30

すいません。やっと理解できるようになりました。何度もありがとうございます。
guest

0

とりあえず、change_letter関数は文字数を数えていないので、
間違っています。

ポインタを使って文字列の長さを求めるコードと言われると、
一般的な日本語として考えると、文字数を数えずに、
終端文字の '\0' のポインタ - 先頭のポインタで求めるのではないかと思いますが。
通常、ptrdiff_t 型になりますが、終端文字の '\0' のポインタの方が大きいので、
size_t 型にして返します。

関数にしない例

#include <stdio.h> int main() { char buffer[128]; char *ptr = buffer; scanf("%s", buffer); printf("%s\n", ptr); while (*ptr != 0) { ptr++; } printf("%td\n", ptr - buffer); return 0; }

投稿2020/05/22 09:01

編集2020/05/22 10:26
PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/22 10:34

別のパターンやり方を紹介してくださり、ありがとうございました。理解を深めることができました。
PingHermit

2020/05/22 10:54

いや、ポインタを使って文字列の長さを求めるコードと質問にあるので、 他の人のは全部数えていっているだけなので、 日本語の解釈としては間違ってるんじゃないかと言っていただけです。 まあ、初心者の質問として見た場合は、変わらないと思うので、 あなたがそういう意図で書いていないのだろう事はわかりましたが。
guest

0

C言語での文字列というのは、後尾に'\0'を置いているchar配列、となってます。
なので、'\0'が現れるまでの文字数を数えればいいです

投稿2020/05/22 07:22

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/22 10:33

ありがとうございます。無事に理解することができました。
guest

0

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int change_letter(char* ptr) { int i = 0; while (ptr[i] != '\0') { i = i + 1; } return i; } void main() { char buffer[128]; char* ptr = buffer; int i=0; scanf("%s", buffer); printf("%s\n", ptr); i=change_letter(ptr); printf("%d", i); }

具体的に同じように考えて変更したところこのコードが通り無事実行できるようになりました。しかし、上と今書いたコードの差がいまいちよくわからないです。思い付きで書いたのですが.

投稿2020/05/22 09:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問