[英]Using C Strings in an array
這是我編寫的程序(不包括“ string.h”),旨在將字符串轉換為大寫。 到目前為止,它只適用於單個字符串。
嘗試創建字符串數組時遇到麻煩,因此我可以依次測試各種字符串作為循環的一部分。
因此,我不明白當我的字符串聲明為char test_string[] = "TEST";
時,為什么程序可以運行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;
}
我發現了錯誤。 您不能修改字符串文字。 要解決此問題,您需要替換以下內容:
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)。
您必須為空宏和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;
}
// ...
好的。 重寫兩個程序。 希望這次更好。 但是用string.h庫代替編寫自己的strcpy函數。 雖然我沒有正確地描述Alpha。 這意味着要刪除所有非字母字符,並將結果作為所有小寫字母返回。 --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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.