C++のプログラム中、疑問に思ったことがありましたので質問させていただきます。
 下記のプログラムを実行するとエラーになります。その原因をご存知の方がおりましたら教えてください。

 char* str;
cin >> str;
cout << str;
cout << endl;

 これを void main() などに書きまして実行するとエラーが出ます。
 [str]が配列の数を指定していないので無限に文字を入力でき、それを表示させるという簡単なプログラムですが、[str]をこのように使うとエラーになるのはなぜでしょうか。プログラムに詳しい人に聞いても『そういう仕組みだからそうなるのだろう』と言われるだけです。
 普通、[str]を使うとき、[ ]を使って配列で使うのだと思いますが、『無限に文字を入力できる』ように、上のパターンでプログラムを書くとエラーが出るのはなぜなのかよくわかりません。
 もしご存知の方がおりましたらお教えください。
 よろしくお願いいたします。

A 回答 (4件)

char* str;


はchar型のポインタを入れておく変数の宣言で、
そのままではゴミが入ってます。
int i;
と一緒でそれだけでは意味をなしません。
i = 10;
と初期化するのと同様に、strにも何か入れないといけません。
例えば、
char buf[10];
str = buf;
等です。

無限に文字を入力させるには、
文字を一文字づつ取ってきてて、領域がいっぱいになったら
その都度拡張させるような仕組みにしなければいけません。
    • good
    • 0
この回答へのお礼

やはり絶対に初期化することは必要なのですね。
初期化しなくても使えるのかどうか試してみたわけです。
また、本当にわからなかったことは、このエラーが『不正な処理』というメッセージになるのがなぜかということでした。
不正な処理として強制終了のようになることが疑問に思ったので質問させていただいたわけです。
ですが、お答えいただいたことはとても参考になりましたので感謝しております。
ありがとうございました。

お礼日時:2001/09/09 00:27

エラーの理由に関しては皆さんのおっしゃる通りだと思います。



batacha さんが、上のようなコードが正しいと思った原因は、おそらく、
配列とポインタとの違いがよくわかっていないからではないでしょうか。
配列 a[n] の配列名 a はポインタに似た性質を持ちますが、
(char型だとして) char* a; 等で宣言されるポインタ変数とは異なる
ものだと言うことに注意が必要です。

下の参考URLの第6章が参考になるかと思います。他にも疑問が湧いた場合
はまず下のページを覗いてみると良いかもしれません。

また、せっかくC++を使っているのならstring型を使えばbatachaさんが
やりたいことが実現できますよ。これについては適当なテキストを参考に
してみてください。

参考URL:http://www.catnet.ne.jp/kouno/c_faq/
    • good
    • 0
この回答へのお礼

文面からかなりお詳しい方だと思いました。
ポインタに関しては勉強しなおすことにいたします。
下記のお礼に書きましたように、最初なぜ質問しようと思ったのかといいますと、『不正な処理』というエラーメッセージが出たからでした。
ですが、皆さんのお答えから『初期化』というものが絶対に必要であるということがよくわかりました。
お答えいただいた皆さんに感謝しております。
ありがとうございました。

お礼日時:2001/09/09 00:33

> [str]が配列の数を指定していないので無限に文字を入力でき



とありますが、指定が無いと無限に入力できるというのが
そもそも間違いです。
無限に文字を入力し保存できるような物はこの世にありません。

また、このような書き方をすると無限どころか、
入力できるところが一つも無い状態になります。

普通に、配列を使ってください。


どうしても、無限にしたいのなら、
一文字分だけ入力して、一文字出力を無限に繰り返すことなら可能なので,
そうプログラムしてください。
繰り返しだけなら,論理上無限にできますから。
    • good
    • 0
この回答へのお礼

やはり配列を作らないとダメということですね。
ごもっともです。初期化は必要だと言うことがよくわかりました。
ご指摘ありがとうございました。

お礼日時:2001/09/09 00:29

C++は分からないのですが



Cだと分かるので(一応Cは専門家なので)
ポインタ宣言しただけだとポインタの格納領域を取っただけで
ポインタが指し示す領域は生成されないです。
C++だと
char* str;でポインタ宣言しただけで
入力文字を格納する領域も生成されるのでしょうか。
あ~、逆に質問になっている。すいません。気にしないで下さい。
    • good
    • 0
この回答へのお礼

御礼が遅くなり申し訳ありませんでした。
[C]の専門家なのですね。ポインタは[C]も共通してますからアドバイスはとても参考になりました。
 ありがとうございました。

お礼日時:2001/09/09 00:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q404ERROR の 意味の統一はいつからですか?

こんばんは~! ネットワークのカテゴリーのエキスパートな方々!回答宜しく~^^

質問はタイトルの通りなのですが、『404 ERROR』はいつ頃から共通に利用されてるのですか?
仮に最初に統一した人がいるのなら、使用許諾や使用に当っての利点若しくは、お金が来てるの?

Aベストアンサー

HTTPエラーコード404。
Not Found:要求されたURIに対するマッチする情報が見つからない(RFC1945)
通信規約上の約束です。

RFC(Request For Comment:ご意見お待ちしてます)はインターネット標準案と標準規約を記述したメモで、誰でも参照して利用することが出来ます。

いつから?と問われればRFC1945に制定されたメモが発表された1996年からです。

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

Q404 Error Not Found と出てしまします

初めてホームページを作ろうとしている者なので、専門用語ではなく、わかりやすく教えて下さいませm(__)m
「HETEMULU」を使って、ホームページを作り、半年かけて、やっと完成しました^^;
そして、無料だと聞いたので、「忍者ホームページ」サイトで、
「NINJA TOOLS」?という所で、IDやパスワードを取得し、なんとか出来たと思ったのですが、

登録されているあなたのURL

とい所をクリックすると、

404 Error Not Found と出てしまします。

何故ですか??

色々触ってみたけど、わかりません^^;

もう一つ質問ですが、無料素材屋さんから、画像をダウンロードして、
「名前をつけて保存」と書いてあったので、例えば「鉢植え」と保存しました。「HETEMULU」で画像の挿入をクリックすると、「鉢植え」の後ろに.gifと付き、問題ないように思っているのですが、日本語で保存しているから、404 Error Not Found と出てしまうのでしょうか?それともそれはまったく関係ないのでしょうか?
慣れていらっしゃる方にはおバカな質問かもしれませんが、どうかどなたか教えて下さい!説明が足りなければ補足しますので、どうかよろしくお願いします!!!

初めてホームページを作ろうとしている者なので、専門用語ではなく、わかりやすく教えて下さいませm(__)m
「HETEMULU」を使って、ホームページを作り、半年かけて、やっと完成しました^^;
そして、無料だと聞いたので、「忍者ホームページ」サイトで、
「NINJA TOOLS」?という所で、IDやパスワードを取得し、なんとか出来たと思ったのですが、

登録されているあなたのURL

とい所をクリックすると、

404 Error Not Found と出てしまします。

何故ですか??

色々触ってみたけど、わか...続きを読む

Aベストアンサー

作成したHTMLファイルをサーバーにアップロード(転送)済みで
しょうか?
トップページは必ず「index.html」または「index.htm」である
必要があります。
「index.htm」にする場合は、元からある「index.html」を削除
(※下記ページ参照)
http://www.ninja.co.jp/faq/a/37/

おすすめのFTPソフト
「FFFTP」
http://www2.biglobe.ne.jp/~sota/

日本語ファイルは表示されない場合もあるので、英数字のファイル名
が推奨されています。
http://www.ninja.co.jp/faq/a/79/

Q&str[n]とpstr + nと&pstr[n]

あるプログラミングの本で

&str[n]
pstr + n
&pstr[n]

は同じだと書いてあり、考えたのですが、
上の二つはstr[n]のアドレスを表しているとしても、
三つ目はstr[n]のポインタのアドレスを表していると思うのですが
どこが間違っているのでしょうか?教えてください。

Aベストアンサー

>本にも突然でてきているのでよくわからないのですが・・・。

よくわからないもの同士が同じかと聞かれても、よくわからないというのが答えです。
本当に、突然出てきているのなら、そんな本は捨てましょう。

Q教えて下さい!なぜ【WebApp: Error 404】のページが出る?

JDK + apache + mod_webapp.so + tomcat + PostgreSQLをインストール・設定しました。

JDK     j2sdk-1_3_1_11-linux-i586
apache    apache1.3.31
mod_webapp.so
tomcat    jakarta-tomcat-4.1.30
PostgreSQL    postgresql-7.2.3

(1)
http://localhost:8080/index.jsp
【tomcat】のページが出ます。

(2)
http://localhost/
【あなたの予想に反して、このページが見えているでしょうか?】のページが出ます。

(3)
http://localhost:8080/examples/jsp/index.html
【JSP Samples】のページが出ます。

(4 問題点)
http://localhost/examples/jsp/index.html
【WebApp: Error 404】のページが出ます。
希望 → (3)と同じページが出る。

起動は tomcat → apache の順です。

なぜ【WebApp: Error 404】のページが出るのでしょうか?
教えて下さい。
お願いします。
(初心者なので出来ればわかりやすくお願いします)

JDK + apache + mod_webapp.so + tomcat + PostgreSQLをインストール・設定しました。

JDK     j2sdk-1_3_1_11-linux-i586
apache    apache1.3.31
mod_webapp.so
tomcat    jakarta-tomcat-4.1.30
PostgreSQL    postgresql-7.2.3

(1)
http://localhost:8080/index.jsp
【tomcat】のページが出ます。

(2)
http://localhost/
【あなたの予想に反して、このページが見えているでしょうか?】のページが出ます。

(3)
http://localhost:...続きを読む

Aベストアンサー

設定内容が書いていないので
いかんともあれなんですが。。。(^^;
以下の手順をご確認下さい。

1.mod_webapp.soをapacheのlibexecに配置している。

2.apacheのhttpd.confに以下を記述している。
------------------------------------------------------
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c

<IfModule mod_webapp.c>
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples
WebAppInfo info
</IfModule>
------------------------------------------------------

3.tomcatのserver.xmlに以下を記述している。
------------------------------------------------------
<Service name="Tomcat-Apache">

<Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true" appBase="webapps"
acceptCount="10" debug="0"/>

<Engine className="org.apache.catalina.connector.warp.WarpEngine"
name="Apache" debug="0">

<Logger className="org.apache.catalina.logger.FileLogger"
prefix="apache_log." suffix=".txt"
timestamp="true"/>

<Realm className="org.apache.catalina.realm.MemoryRealm" />

</Engine>

</Service>
------------------------------------------------------

4.tomcat、apacheの順で再起動

どう?

設定内容が書いていないので
いかんともあれなんですが。。。(^^;
以下の手順をご確認下さい。

1.mod_webapp.soをapacheのlibexecに配置している。

2.apacheのhttpd.confに以下を記述している。
------------------------------------------------------
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c

<IfModule mod_webapp.c>
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples
WebAppInfo info
</IfModule...続きを読む

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

QError!! HTTP status code=404

Error!! HTTP status code=404

いつもお知恵拝借、ありがとうございますm(_ _)m

さて、最近当社で中古XP (prof.)パソコンを2台導入しました。sp3にupしております。

取引先のサイトにアクセスし、IDとpasswordでログインして「取引明細」をダウンロードしようとしましたが、ファイルのアイコンをクリックしたら上記のようなエラーメッセージが出ます。

2台とも同じエラーが出ます。

「教えてgoo」や他のサイトで検索してもなかなか、コレというページが見あたりません。

以前からあるもう一台のXPからはアクセスでき、見ること・プリントすることが出来ます。

アクセスしようとしたファイルは拡張子が".ilf"で、検索の結果どうやら電子帳票のファイルのようです。

このようなトラブルは初体験なので、皆さんのお知恵を是非拝借したいと思います。どうかよろしくお願いいたしますm(_ _)m

Aベストアンサー

ILFのことについてはわかりませんが、単純にHTTP のエラーコード404は、
Not Foundですね。

要するに、指定のページやファイルが見当たらないということ。

先方のシステム内で、指定されたファイルがないということではないですか?
それを先方のWEBサーバーと連携したILFのシステムが応えていると・・・

先方の担当者に聞いた方がいいと思いますが。
特定のシステム内のことですので、担当者以外は本当のことはわかりません。

QC++ : cout << (数字) で実行時エラーが発生する理由

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for...続きを読む

Aベストアンサー

> void rev_str(const char *source, char *des)
> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう

QHTTP 404 error

Vine Linux,Tomcat5で
(1)webapps/conf/server.xml
...
<HOST>
<Context path="/apress" docBase="apress" debug="0" reloadable="true" />
...
(2)webbapps/apress/login.jsp
...
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="servlet/chapter2.login">
<tr><td width="402"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username"></td>
</tr>
...
(3)webapps/apress/WEB-INF/web.xml
...
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>chapter2.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
...
(4)webapps/apress/WEB-INF/classes/chapter2/login.java
package chapter2;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class login extends HttpServlet {
private String target = "/welcome.jsp";
private String getUser(String username, String password) {
// Just return a statice name
// If this was reality, we would perform a SQL lookup
return "Bob";
}
....
(4)現象:
http://xxx.xxx.xxx.xxxx:8080/apress/login.jsp
でsubmit action 後、次のエラーが出てきました:
HTTP 404 error,
The requested resource (/apress/servlet/chapter2.login) is not available.

この問題はどこにあるでしょうか教えてください。

Vine Linux,Tomcat5で
(1)webapps/conf/server.xml
...
<HOST>
<Context path="/apress" docBase="apress" debug="0" reloadable="true" />
...
(2)webbapps/apress/login.jsp
...
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="servlet/chapter2.login">
<tr><td width="402"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username"></td>
</tr>
...
(3)webapps/apress/WEB-INF/web....続きを読む

Aベストアンサー

パスの指定が間違ってるからだと思いますが。

/apress/servlet/chapter2.login

このパスにちゃんと存在してますか?

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む


人気Q&Aランキング