[英]I'm having trouble converting argv to upper in C
我正在嘗試將固定大小的 argv 轉換為上和下,但它要么給我分段錯誤,要么只是在 var 上存儲亂碼。 我試過這個:
#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("%c\n",(char) argv[1][i]);
printf("%c\n",(char) argv[1][i]);
printf("%c\n",tolower(argv[1][i]));
printf("%c\n",toupper(argv[1][i]));
lower += tolower(argv[1][i]);
upper += toupper(argv[1][i]);
}
最奇怪的部分是 printf 給出了正確的值,但它們並沒有存儲在lower
或upper
中。 我在這里做什么?
您不能在 C 到 append 中使用+=
到字符串。
<cs50.h>
將string
定義為char *
。 然后string lower = "";
將lower
定義為char *
並將其設置為指向""
的第一個字符。 ""
表示一個null字符串,該字符串的第一個也是唯一一個字符是null(零值)字符,表示字符串的結束。
attempts to advance the pointer by elements of the type it points to.當應用指針時,
+=
嘗試將指針前進它指向的類型的元素。 例如,如果指針
p
指向數組的元素 3,則p += 4
將使其指向元素 7。
由於lower
指向只有一個元素的數組元素,因此 null 字符lower += tolower(argv[1][i])
試圖使其指向數組外部。 C 標准未定義該行為。 (除非它可能在 C 實現中,其中應用於該字符的tolower
會產生一個值為 1 的字符。這將修改lower
以指向數組中的最后一個元素,這是一個特殊的 position 允許用於指針運算。 )
使用string lower = "abcdefghijklmnopqrstuvwxyz";
,你有更多的空間來做數組運算; 一些添加到lower
將起作用。 但是, tolower(argv[1][i])
可能太大而無法保留在數組中。
此外,即使指針算術有效, lower += …
也只會更改指針。 它不會改變它指向的字符。
為了使您的代碼正常工作,您需要分配足夠的 memory 來保存生成的字符串,包括 null 字符,並且您必須將lower
設置為指向該 memory,類似地設置為upper
。 您需要的字符數是strlen(argv[1][i]) + 1
。 如果你已經學會了如何使用malloc
,你可以使用它。 如果您有保證argv[1]
正好是 26 個字符的固定分配,您可以定義lower
並通過用char lower[27];
,對於upper
也是如此。
然后,您必須將字符復制到該 memory 中,您可以使用lower[i] = tolower(argv[1][i]);
. 將字符復制到數組中后,應在其末尾寫入一個 null 字符,以形成一個完整的 C 字符串。 (如果您不打算將數組打印為字符串或以其他方式將其用作字符串,則可以省略它。)
如果您調用man toupper
,您將了解到 function 不采用字符串,而是采用字符。 因此,實現您所追求的一種方法是遍歷命令行參數中的每個字符,對其調用toupper
,然后將結果存儲回來。
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[])
{
printf("before: %s\n", argv[1]);
for (unsigned int i = 0, n = strlen(argv[1]); i < n; i++) {
argv[1][i] = (char) toupper(argv[1][i]);
}
printf("after: %s\n", argv[1]);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.