1

さて、簡単に言えば、問題が発生しています。文字配列 (文字列) の開始アドレスを関数に送信しようとしています。関数がポインタを取得したら、(特定の文字を変更するために) 関数が文字を 1 つずつ解析するようにします。今のところ、各文字を印刷するように設定しただけですが、それでもひどく失敗しています。

これは私が持っているものです:

#include "system.h"
#include <stdio.h>

typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;

void EXCLAIM(char *msg){
    char the_char = 0;
    the_char = msg;
    while (the_char != 0)
    {
        printf(the_char);
        *msg = *(msg++);
        the_char = *msg;
    }
}

int main(void) {
    char *first_str = "This is a test. Will this work. I. am. Not. Sure...";
    while (1) {
        EXCLAIM(first_str);
    }
}

編集:

これが私がやろうとしていた更新されたコードです。ポインターを送信し、すべてのピリオドを感嘆符に置き換えて各文字を調べます。

#include "system.h"
#include <stdio.h>

typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;

void exclaim(char *msg){
    int i;
    for( i=0; msg[i]; i++ )
    {
        if (msg[i] == '.') {
            msg[i] = '!';
        }
    }
printf(msg);
}

int main(void) {
    char *the_sentences = "This is a test. Will this work. I. am. Not. Sure...";
    while (1) {
        exclaim(the_sentences);
    }
}

ご協力ありがとうございました!

4

5 に答える 5

1

言及されていませんが、文字列リテラルを変更しようとすると、未定義の動作になります。

次の行を変更する必要があります。

char *the_sentences = "This is a test. Will this work. I. am. Not. Sure...";

配列に。

char the_sentences[] = "This is a test. Will this work. I. am. Not. Sure...";

次に、関数内の内容を自由に変更してください。

#include <stdio.h>

void foo(char *msg)
{
    for (; *msg; msg++)
        if (*msg == '?')
            *msg = '!';
}

int main(void)
{
    char line[] = "Hello, world?? How are you tonight??";

    foo(line);

    puts(line);
    return 0;
}
于 2012-10-15T04:22:47.797 に答える
1

次のようなことを試してください:

#include <stdio.h>

void exclaim(char * s)
{
    while (*s != '\0')
    {
        putc(*s);
        ++s;
    }
}

ノート:

  • 叫ぶな。プリプロセッサ マクロ以外にはすべて大文字を使用しないでください。

  • 文字列ではなく文字を出力します。

  • 別のコピーを作成する必要はありません。関数の引数は、すでに直接使用できるローカル変数です。

于 2012-10-15T02:40:12.527 に答える
1

あなたの main() は問題ありません。

問題は、EXCLAIM 内のポインター演算にあります。

便利な 2 つの異なるバージョンを確認できます。

ポインター演算の使用

while (*msg)
{
    printf("%c", *msg);
    msg++
}

索引付けの使用

int i;
char the_char;
for( i=0; msg[i]; i++ )
{
    printf( "%c", msg[i] );
}
于 2012-10-15T02:40:41.410 に答える
1

以下を使用する必要があります。

  the_char = *msg;

いいえ:

  the_char = msg;
于 2012-10-15T02:46:29.537 に答える
1
*msg = *(msg++); 

このコード行で何をしようとしていますか? それが実際に何をするのか理解していますか?msg++まず、ポインタの値を変更することを知っておく必要があります。次に、それが指すために使用されたものを新しい場所に割り当てます。これは、文字列全体が文字列の最初の文字のコピーに置き換えられることを意味します。

この話の教訓は、1 行のコードで多くのことを実行しないことです。インクリメント演算子には特に注意する必要があります++msg++経験豊富なプログラマーでさえ、複雑な式と混ぜようとすると複雑になりすぎるため、通常、独自の行にlike を入れます。

于 2012-10-15T02:54:28.413 に答える