6

我想要做的是遍历报价直到报价结束/(*报价中没有任何内容)。我的代码有效吗?

char *quote = "To be or not to be, that is the question.";
for (quote = 0; *quote != NULL; quote++){
*quote = tolower(*quote);
}
4

3 回答 3

13

您可能需要另一个指针来遍历数组,否则将丢失对原始字符串的访问。

最好只NULL用于指针。

不要0用作初始值,除非您想改用索引(见下文)。

这样做char *quote =只会quote指向只读文字,而不是复制字符串。改为使用char quote[] =

char quote[] = "To be or not to be, that is the question.";
char *quotePtr;
for (quotePtr = quote; *quotePtr != '\0'; quotePtr++){
  *quotePtr = tolower(*quotePtr);
}

测试

使用索引:

char quote[] = "To be or not to be, that is the question.";
int i;
for (i = 0; quote[i] != '\0'; i++){
  quote[i] = tolower(quote[i]);
}

测试

于 2013-09-24T23:12:21.453 回答
2

将此视为对杜克林给出的答案的扩展

当你使用

char *quote = "Hello World";

这会生成一个只读字符串,这意味着您不能以更简单的方式更改其内容。

Here *quote points to 'H'
BUT, you cannot do *quote = 'A';
This will give you an error.

如果您希望更改字符串中的字符,使用数组是一个好习惯。

char quote[] = "Hello World";
Here also *quote points to 'H'
BUT, in this case *quote = 'A' is perfectly valid.
The array quote will get changed.
于 2013-09-25T05:14:41.607 回答
0

quotefor初始化程序中重新分配,这是无效的,并且会导致访问冲突,因为您在*quote != NULL部件中取消引用它。

在语义上NULL'\0'是等价的,但在语法上我更喜欢这个。请注意,通过使用这种方法,您可以保留一个指向字符串(开头)的指针。

wchar const_t* quote = L"To be or not to be, that is the question.";

for( wchar_t* c = quote; *c != '\0'; c++ ) {

    *c = tolower( *c );
}

或者使用索引:

wchar const_t quote[] = L"To be or not to be, that is the question.";

for( size_t i = 0; i < sizeof(quote); i++ ) {

    quote[i] = tolower( quote[i] );
}

(请注意,如果在编译时不知道sizeof的值,则 的语义会发生变化)quote

于 2013-09-24T23:21:52.493 回答