在数组中使用C字符串
这是我编写的一个程序(不包括“string.h”),用于将字符串转换为大写。它只使用一个字符串-到目前为止还不错 当我试图创建一个字符串数组以便作为循环的一部分依次测试各种字符串时,我遇到了麻烦 所以,当我的字符串被声明为char在数组中使用C字符串,c,C,这是我编写的一个程序(不包括“string.h”),用于将字符串转换为大写。它只使用一个字符串-到目前为止还不错 当我试图创建一个字符串数组以便作为循环的一部分依次测试各种字符串时,我遇到了麻烦 所以,当我的字符串被声明为chartest\u string[]=“test”时,我不明白为什么程序会工作
test\u string[]=“test”时,我不明白为什么程序会工作但是当我声明一个指向字符串的指针数组时,它不起作用
这是工作单字符串版本(后跟非工作字符串数组版本):
#包括
对阿尔法无效(字符*);
内部结构(字符*);
int main()
{
char test_string[]=“test”/*要测试的字符串*/
char*pStr=NULL;/*指向字符串的指针*/
pStr=测试字符串;
toAlpha(pStr);
printf(“%s\n”,pStr);
返回0;
}
无效到alpha(字符*arg)
{
int i=0;/*计数器-原始字符串*/
int j=0;/*计数器-临时字符串*/
/*检查原件中的每个字符并仅保存字母字符*/
对于(i=0;i='a'&&&*(arg+i)='a'&&*(arg+i)='a'&&*(arg+i)='a'&&*(arg+i)则必须为NULL宏和printf包含“stdio.h”。
运行时问题是因为您有一个包含1个元素的数组,并且正在将“TEST2”分配到不存在的第二个位置。
我不明白你想在toAlpha做什么()
#包括
// ...
int main()
{
char*test_字符串[2];/*要测试的字符串*/
char*pStr=NULL;/*指向字符串的指针*/
测试字符串[0]=“TEST1”;
测试字符串[1]=“TEST2”;
对于(int i=0;i<2;++i)
{
pStr=测试字符串[i];
toAlpha(pStr);
printf(“%s\n”,pStr);
}
返回0;
}
// ...
我发现了错误。您无法修改字符串文字。若要解决此问题,您需要替换以下内容:
test_strings[0] = "TEST1";
test_strings[1] = "TEST2";
作者:
因为您不想包含string.h,所以您似乎需要实现strcpy函数,还需要包含stdlib.h(因为malloc).好的。重写两个程序。希望这次更好。但使用string.h库代替编写我自己的strcpy函数。虽然我没有正确地描述到alpha。这意味着删除任何非字母字符,并以所有小写字母返回结果。--Topsail
第一个程序(单字符串):
#包括
#包括
#包括
对阿尔法无效(字符*);
内部结构(字符*);
int main()
{
字符测试_字符串[100];/*要测试的字符串*/
char*pStr=NULL;/*指向字符串的指针*/
strcpy(测试字符串,“测试A”);
pStr=测试字符串;
toAlpha(pStr);
printf(“%s\n”,pStr);
返回0;
}
无效到alpha(字符*arg)
{
int i=0;/*计数器-原始字符串*/
int j=0;/*计数器-临时字符串*/
/*检查原件中的每个字符并仅保存字母字符*/
对于(i=0;i 如果(*(arg+i)='a'&&&*(arg+i)='a'&&*(arg+i)='a'&&*(arg+i)='a'&*(arg+i)='a'&&*(arg+i)2个字未定义的行为
或更多*其他地方可能有未定义的行为,但此行:test\u strings[1]=“TEST2”
当然是未定义的行为。还有两个词语法糖
——即char foo[]=“…”
正如您在第一个示例中所做的那样,是一种特殊的语法糖。有关详细解释,请参见注释中的第一个SO链接。谢谢。我一直在阅读链接,并在stack overflow上找到了一些关于此的其他帖子。我会遵守的!语法糖很甜,至少有一段时间是这样的。我认为NULL是假设的d要在stdlib.h
中定义,请参见例如@Brandin:您的链接没有指定NULL的定义位置,stdlib.h可能包括stddef.h,但是,我的答案不正确(已编辑),因为stddef.h和stdio.h中都定义了NULL,所以不必包含stddef.h。请参阅…谢谢-添加了stdlib.h。它应该在那里。更准确地说,是直接指向C标准的指针(ISO/IEC 9899:201x-N1570).7.19常见定义-第3段和第7.21输入/输出第3段好的。我确信。我会尝试一下。我想我也会分解并添加string.h-今晚不再编写我自己的字符串函数!注意:事实证明,作为练习,实现字符串复制函数并不困难。请参阅注释(和注意事项)这里:还有Kernighan和Ritchie第二版第5.5节。
#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;
}
#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;
}
// ...
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");
#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;
}