【发布时间】:2014-02-15 22:26:32
【问题描述】:
这是我编写的一个程序(不包括“string.h”),用于将字符串转换为大写。它适用于单个字符串 - 到目前为止一切都很好。
当我尝试创建一个字符串数组时遇到了麻烦,因此我可以在循环中依次测试各种字符串。
所以,我不明白为什么当我的字符串被声明为 char test_string[] = "TEST"; 时程序可以工作,但是当我声明一个指向字符串的指针数组时它却不能工作。
这是工作的单个字符串版本(后面是不工作的字符串数组版本):
#include <stdio.h>
void toAlpha(char*);
int str_len(char*);
int main()
{
char test_string[] = "TEST"; /* string to test */
char *pStr = NULL; /* pointer to string */
pStr = test_string;
toAlpha(pStr);
printf("%s\n", pStr);
return 0;
}
void toAlpha(char *arg)
{
int i = 0; /* counter - original string*/
int j = 0; /* counter - temp string */
/* check each character in original and save alphabetic characters only */
for ( i = 0; i < str_len(arg); i++ )
{
if( *(arg + i) >= 'a' && *(arg + i) <= 'z' )
*(arg + j++) = *(arg + i);
else
if ( *(arg + i) >= 'A' && *(arg + i) <= 'Z' )
*(arg + j++) = *(arg + i) - 'A' + 'a';
}
/* add a null character terminator */
*(arg + j) = '\0';
}
int str_len(char *arg)
{
/*return count of letters in a C string */
int i = 0;
if ( arg != NULL )
while ( arg[i] != '\0' )
i++;
return i;
}
这是尝试使用数组失败的非工作版本(它编译但在运行时崩溃):
#include <stdio.h>
void toAlpha(char*);
int str_len(char*);
void palindrome(char*);
int main()
{
char *test_strings[1]; /* strings to test */
char *pStr = NULL; /* pointer to string */
int i = 0; /* loop counter */
test_strings[0] = "TEST1";
test_strings[1] = "TEST2";
for (i = 0; i < 1; i++){
pStr = test_strings[i];
toAlpha(pStr);
printf("%s\n", pStr);
}
return 0;
}
void toAlpha(char *arg)
{
int i = 0; /* counter - original string*/
int j = 0; /* counter - temp string */
/* check each character in original and save alphabetic characters only */
for ( i = 0; i < str_len(arg); i++ )
{
if( *(arg + i) >= 'a' && *(arg + i) <= 'z' )
*(arg + j++) = *(arg + i);
else
if ( *(arg + i) >= 'A' && *(arg + i) <= 'Z' )
*(arg + j++) = *(arg + i) - 'A' + 'a';
}
/* add a null character terminator */
*(arg + j) = '\0';
}
int str_len(char *arg)
{
/*return count of letters in a C string */
int i = 0;
if ( arg != NULL )
while ( arg[i] != '\0' )
i++;
return i;
}
【问题讨论】:
-
2字
undefined behaviour -
其他地方可能存在未定义的行为,但这一行:
test_strings[1] = "TEST2";肯定是未定义的行为。 -
还有 2 个单词
syntactical sugar-- 即char foo[] = "......";就像您在第一个示例中所做的那样,这是一种特殊的语法糖。详细解释见cmets中第一个SO链接 -
谢谢。我一直在阅读链接,并在堆栈溢出时在这里找到了一些关于此的其他帖子。会遵守的!语法糖很甜,至少有一段时间。
标签: c