我试图将一个固定大小的argv转换为上限和下限,但它要么给我分段错误,要么只是在变量上存储胡言乱语。我尝试过这个:
#include <stdlib.h>
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(int argc, string argv[])
{
string lower = "abcdefghijklmnopqrstuvwxyz";
string upper = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0, n = 26; i < n; i++)
{
lower[i] = tolower(argv[1][i]);
upper[i] = toupper(argv[1][i]);
}
}
或:
string lower = "";
string upper = "";
//check if repeated chars or numbers
for (int i = 0, n = 26; i < n; i++)
{
printf("%cn",(char) argv[1][i]);
printf("%cn",(char) argv[1][i]);
printf("%cn",tolower(argv[1][i]));
printf("%cn",toupper(argv[1][i]));
lower += tolower(argv[1][i]);
upper += toupper(argv[1][i]);
}
最奇怪的是printf给出了正确的值,但它们没有存储在lower
或upper
中。我在这里干什么?
不能在C中使用+=
来附加到字符串。
CCD_ 4将CCD_ 5定义为CCD_。然后string lower = "";
将lower
定义为char *
,并将其设置为指向""
的第一个字符。""
表示空字符串,该字符串的第一个也是唯一一个字符是空(零值(字符,表示字符串的末尾。
当应用指针时,+=n
会尝试将指针前移其所指向类型的n
元素。例如,如果指针p
指向数组的元素3,则p += 4
会使其指向元素7。
由于lower
指向一个只有一个元素(空字符(的数组中的一个元素,lower += tolower(argv[1][i])
尝试使其指向数组之外。行为不是由C标准定义的。(除了它可能在C实现中,其中tolower
应用于该字符会产生值为1的字符。这将修改lower
,使其刚好指向数组中的最后一个元素之外,这是指针算术所允许的特殊位置。(
有了string lower = "abcdefghijklmnopqrstuvwxyz";
,您可以有更多的空间进行数组运算;对CCD_ 21的一些添加将起作用。然而,tolower(argv[1][i])
可能太大而无法保留在阵列内。
此外,即使指针算术工作,lower += …
也仅改变指针。它不会更改指向的字符。
为了使代码正常工作,您需要分配足够的内存来保存结果字符串,包括null字符,并且必须将lower
设置为指向该内存,对于upper
也是如此。您需要的字符数是strlen(argv[1][i]) + 1
。如果你已经学会了如何使用malloc
,你就可以使用它。如果您有一个固定的赋值,可以保证argv[1]
正好是26个字符,那么您可以定义lower
,并通过用char lower[27];
声明它来为它提供内存,upper
也是如此。
然后,您必须将字符复制到该内存中,这可以通过lower[i] = tolower(argv[1][i]);
来完成。将字符复制到数组中后,应在数组末尾写入一个null字符,以形成一个完整的C字符串。(如果您不打算将数组打印为字符串或以其他方式将其用作字符串,则可以省略此操作。(
如果调用man toupper
,您将了解到该函数不接受字符串,而是接受字符。因此,实现您所追求的目标的一种方法是对命令行参数中的每个字符进行循环,对其调用toupper
,并将结果存储回来。
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[])
{
printf("before: %sn", argv[1]);
for (unsigned int i = 0, n = strlen(argv[1]); i < n; i++) {
argv[1][i] = (char) toupper(argv[1][i]);
}
printf("after: %sn", argv[1]);
}