这是我编写的程序(不包括“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;
}
答案 0 :(得分:1)
我发现了错误。您无法修改字符串文字。要解决此问题,您需要替换以下内容:
test_strings[0] = "TEST1";
test_strings[1] = "TEST2";
由:
test_strings[0] = (char *) malloc(sizeof(char) * (strlen("TEST1") + 1)); // +1 for the \n
test_strings[1] = (char *) malloc(sizeof(char) * (strlen("TEST2") + 1)); // +1 for the \n
strcpy(test_strings[0], "TEST1");
strcpy(test_strings[1], "TEST2");
由于您不想包含string.h,因此您似乎需要实现strcpy函数。你还需要包含stdlib.h(因为malloc)。
答案 1 :(得分:0)
您必须为NULL宏和printf包含“stdio.h”。 运行时问题是因为您有一个1元素的数组,并且您将“TEST2”分配给不存在的第二个位置。 我不明白你想在toAlpha()中做什么。
#include <stdio.h>
// ...
int main()
{
char *test_strings[2]; /* strings to test */
char *pStr = NULL; /* pointer to string */
test_strings[0] = "TEST1";
test_strings[1] = "TEST2";
for (int i = 0; i < 2; ++i)
{
pStr = test_strings[i];
toAlpha(pStr);
printf("%s\n", pStr);
}
return 0;
}
// ...
答案 2 :(得分:0)
好。重写了两个程序。希望这次更好。但是使用string.h库来代替编写我自己的strcpy函数。虽然我没有正确描述到阿尔法。它意味着删除任何非字母字符,并将结果作为所有小写字母返回。 --Topsail
第一个程序(单个字符串):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void toAlpha(char*);
int str_len(char*);
int main()
{
char test_string[100]; /* string to test */
char *pStr = NULL; /* pointer to string */
strcpy(test_string, "Test-A");
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>
#include <stdlib.h>
#include <string.h>
void toAlpha(char*);
int str_len(char*);
void palindrome(char*);
int main()
{
char *test_strings[2]; /* strings to test */
char *pStr = NULL; /* pointer to string */
int i = 0; /* loop counter */
test_strings[0] = (char *) malloc(sizeof(char) * (strlen("TEST-A") + 1));
strcpy(test_strings[0], "TEST-A");
test_strings[1] = (char *) malloc(sizeof(char) * (strlen("TEST-1") + 1));
strcpy(test_strings[1], "TEST-B");
for (i = 0; i < 2; i++){
pStr = test_strings[i];
toAlpha(pStr);
printf("%s\n", pStr);
free(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;
}